18 for (
int i = 0; i < 2; ++i) {
19 string header = string(
"#define SUPERIMPOSE ")
20 + char(
'0' + i) +
'\n';
23 scalerProgram[i].
attach(vertexShader);
24 scalerProgram[i].
attach(fragmentShader);
25 scalerProgram[i].
link();
27 if (GLEW_VERSION_2_0) {
29 glUniform1i(scalerProgram[i].getUniformLocation(
"colorTex"), 0);
31 glUniform1i(scalerProgram[i].getUniformLocation(
"videoTex"), 1);
33 glUniform1i(scalerProgram[i].getUniformLocation(
"edgeTex"), 2);
34 glUniform1i(scalerProgram[i].getUniformLocation(
"offsetTex"), 3);
35 glUniform2f(scalerProgram[i].getUniformLocation(
"texSize"),
43 glTexImage2D(GL_TEXTURE_2D,
55 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
56 for (
int i = 0; i < 3; ++i) {
59 "shaders/HQ" << n <<
"xLiteOffsets.dat";
62 offsetTexture[i].
bind();
64 glTexImage2D(GL_TEXTURE_2D,
72 offsetFile.mmap(size));
74 glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
79 unsigned srcStartY,
unsigned srcEndY,
unsigned srcWidth,
80 unsigned dstStartY,
unsigned dstEndY,
unsigned dstWidth,
81 unsigned logSrcHeight)
83 unsigned factorX = dstWidth / srcWidth;
84 unsigned factorY = (dstEndY - dstStartY) / (srcEndY - srcStartY);
86 auto& prog = scalerProgram[superImpose ? 1 : 0];
87 if ((srcWidth == 320) && (factorX > 1) && (factorX == factorY)) {
89 glActiveTexture(GL_TEXTURE3);
90 offsetTexture[factorX - 2].
bind();
91 glActiveTexture(GL_TEXTURE2);
94 glActiveTexture(GL_TEXTURE1);
97 glActiveTexture(GL_TEXTURE0);
101 dstStartY, dstEndY, dstWidth);
105 srcStartY, srcEndY, srcWidth,
106 dstStartY, dstEndY, dstWidth,
113 unsigned srcStartY,
unsigned srcEndY,
unsigned lineWidth,
116 if (lineWidth != 320)
return;
118 unsigned tmpBuf2[320 / 2];
121 memset(tmpBuf2, 0,
sizeof(tmpBuf2));
129 if (
unsigned short* mapped = edgeBuffer.
mapWrite()) {
130 for (
unsigned y = srcStartY; y < srcEndY; ++y) {
134 memcpy(mapped + 320 * y, tmpBuf2, 320 *
sizeof(
unsigned short));
139 glTexSubImage2D(GL_TEXTURE_2D,