15 template<
typename Pixel>
33 template<
typename Pixel>
38 for (
unsigned srcY = srcStartY, dstY = dstStartY;
39 dstY < dstEndY; srcY += 1, dstY += 1) {
45 template<
typename Pixel>
50 for (
unsigned srcY = srcStartY, dstY = dstStartY;
51 dstY < dstEndY; srcY += 2, dstY += 1) {
54 Pixel color01 = pixelOps.template blend<1, 1>(color0, color1);
59 template<
typename Pixel>
61 unsigned srcStartY,
unsigned ,
unsigned srcWidth,
67 for (
unsigned srcY = srcStartY, dstY = dstStartY;
68 dstY < dstEndY; ++srcY, ++dstY) {
69 auto* srcLine = src.
getLinePtr(srcY, srcWidth, buf);
71 scale(srcLine, dstLine, dstWidth);
76 template<
typename Pixel>
77 static void doScaleDV(FrameSource& src,
78 unsigned srcStartY,
unsigned ,
unsigned srcWidth,
79 ScalerOutput<Pixel>& dst,
unsigned dstStartY,
unsigned dstEndY,
80 PixelOperations<Pixel> ops, PolyLineScaler<Pixel>&
scale)
82 BlendLines<Pixel> blend(ops);
83 unsigned dstWidth = dst.getWidth();
86 for (
unsigned srcY = srcStartY, dstY = dstStartY;
87 dstY < dstEndY; srcY += 2, dstY += 1) {
88 auto* srcLine0 = src.getLinePtr(srcY + 0, srcWidth, buf0);
89 auto* srcLine1 = src.getLinePtr(srcY + 1, srcWidth, buf1);
90 auto* dstLine = dst.acquireLine(dstY);
91 scale(srcLine0, dstLine, dstWidth);
92 scale(srcLine1, buf0, dstWidth);
93 blend(dstLine, buf0, dstLine, dstWidth);
94 dst.releaseLine(dstY, dstLine);
99 template<
typename Pixel>
101 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
105 doScale1<Pixel>(src, srcStartY, srcEndY, srcWidth,
106 dst, dstStartY, dstEndY, op);
109 template<
typename Pixel>
111 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
115 doScaleDV<Pixel>(src, srcStartY, srcEndY, srcWidth,
116 dst, dstStartY, dstEndY, pixelOps, op);
119 template<
typename Pixel>
121 unsigned srcStartY,
unsigned ,
unsigned srcWidth,
128 for (
unsigned srcY = srcStartY, dstY = dstStartY;
129 dstY < dstEndY; ++srcY, ++dstY) {
131 auto* srcLine = src.
getLinePtr(srcY, srcWidth, dstLine);
132 if (srcLine != dstLine)
copy(srcLine, dstLine, srcWidth);
137 template<
typename Pixel>
139 unsigned srcStartY,
unsigned ,
unsigned srcWidth,
146 for (
auto dstY :
xrange(dstStartY, dstEndY)) {
148 auto* srcLine0 = src.
getLinePtr(srcStartY++, srcWidth, dstLine);
149 auto* srcLine1 = src.
getLinePtr(srcStartY++, srcWidth, buf);
150 blend(srcLine0, srcLine1, dstLine, dstWidth);
155 template<
typename Pixel>
157 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
161 doScale1<Pixel>(src, srcStartY, srcEndY, srcWidth,
162 dst, dstStartY, dstEndY, op);
165 template<
typename Pixel>
167 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
171 doScaleDV<Pixel>(src, srcStartY, srcEndY, srcWidth,
172 dst, dstStartY, dstEndY, pixelOps, op);
175 template<
typename Pixel>
177 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
181 doScale1<Pixel>(src, srcStartY, srcEndY, srcWidth,
182 dst, dstStartY, dstEndY, op);
185 template<
typename Pixel>
187 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
191 doScaleDV<Pixel>(src, srcStartY, srcEndY, srcWidth,
192 dst, dstStartY, dstEndY, pixelOps, op);
195 template<
typename Pixel>
197 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
201 doScale1<Pixel>(src, srcStartY, srcEndY, srcWidth,
202 dst, dstStartY, dstEndY, op);
205 template<
typename Pixel>
207 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
211 doScaleDV<Pixel>(src, srcStartY, srcEndY, srcWidth,
212 dst, dstStartY, dstEndY, pixelOps, op);
215 template<
typename Pixel>
217 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
221 doScale1<Pixel>(src, srcStartY, srcEndY, srcWidth,
222 dst, dstStartY, dstEndY, op);
225 template<
typename Pixel>
227 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
231 doScaleDV<Pixel>(src, srcStartY, srcEndY, srcWidth,
232 dst, dstStartY, dstEndY, pixelOps, op);
235 template<
typename Pixel>
237 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
243 scaleBlank1to1(src, srcStartY, srcEndY,
244 dst, dstStartY, dstEndY);
247 scale2x1to3x1(src, srcStartY, srcEndY, srcWidth,
248 dst, dstStartY, dstEndY);
251 scale1x1to1x1(src, srcStartY, srcEndY, srcWidth,
252 dst, dstStartY, dstEndY);
255 scale4x1to3x1(src, srcStartY, srcEndY, srcWidth,
256 dst, dstStartY, dstEndY);
259 scale2x1to1x1(src, srcStartY, srcEndY, srcWidth,
260 dst, dstStartY, dstEndY);
263 scale8x1to3x1(src, srcStartY, srcEndY, srcWidth,
264 dst, dstStartY, dstEndY);
267 scale4x1to1x1(src, srcStartY, srcEndY, srcWidth,
268 dst, dstStartY, dstEndY);
277 scaleBlank2to1(src, srcStartY, srcEndY,
278 dst, dstStartY, dstEndY);
281 scale2x2to3x1(src, srcStartY, srcEndY, srcWidth,
282 dst, dstStartY, dstEndY);
285 scale1x2to1x1(src, srcStartY, srcEndY, srcWidth,
286 dst, dstStartY, dstEndY);
289 scale4x2to3x1(src, srcStartY, srcEndY, srcWidth,
290 dst, dstStartY, dstEndY);
293 scale2x2to1x1(src, srcStartY, srcEndY, srcWidth,
294 dst, dstStartY, dstEndY);
297 scale8x2to3x1(src, srcStartY, srcEndY, srcWidth,
298 dst, dstStartY, dstEndY);
301 scale4x2to1x1(src, srcStartY, srcEndY, srcWidth,
302 dst, dstStartY, dstEndY);
310 template<
typename Pixel>
312 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
317 dst, *superImpose, pixelOps);
318 dispatchScale(src, srcStartY, srcEndY, srcWidth,
319 dst2, dstStartY, dstEndY);
321 dispatchScale(src, srcStartY, srcEndY, srcWidth,
322 dst, dstStartY, dstEndY);
BlendLines functor Generate an output line that is an interpolation of two input lines.
Interface for getting lines from a video frame.
Pixel getLineColor(unsigned line) const
Get the (single) color of the given line.
unsigned getHeight() const
Gets the number of lines in this frame.
const Pixel * getLinePtr(int line, unsigned width, Pixel *buf) const
Gets a pointer to the pixels of the given line number.
Polymorphic wrapper around another line scaler.
A video frame as output by the VDP scanline conversion unit, before any postprocessing filters are ap...
virtual void scale4x2to3x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale1x2to1x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
void scaleImage(FrameSource &src, const RawFrame *superImpose, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY) override
Scales the image in the given area, which must consist of lines which are all equally wide.
virtual void scale2x2to1x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scaleBlank2to1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale2x1to1x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale2x1to3x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale2x2to3x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
void dispatchScale(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale8x1to3x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale1x1to1x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scaleBlank1to1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale4x1to3x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale8x2to3x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale4x2to1x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
virtual void scale4x1to1x1(FrameSource &src, unsigned srcStartY, unsigned srcEndY, unsigned srcWidth, ScalerOutput< Pixel > &dst, unsigned dstStartY, unsigned dstEndY)
Scaler1(const PixelOperations< Pixel > &pixelOps)
virtual Pixel * acquireLine(unsigned y)=0
virtual unsigned getWidth() const =0
virtual void fillLine(unsigned y, Pixel color)=0
virtual void releaseLine(unsigned y, Pixel *buf)=0
constexpr vecN< N, T > max(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr mat4 scale(const vec3 &xyz)
This file implemented 3 utility functions:
auto copy(InputRange &&range, OutputIter out)
#define VLA_SSE_ALIGNED(TYPE, NAME, LENGTH)
constexpr auto xrange(T e)