Added color shift support to VideoComponent.

This commit is contained in:
Leon Styhre 2022-12-12 21:51:27 +01:00
parent 46a1e28aa2
commit 6037e80bf1
5 changed files with 52 additions and 0 deletions

View file

@ -275,6 +275,9 @@ std::map<std::string, std::map<std::string, ThemeData::ElementPropertyType>>
{"gameselector", STRING},
{"audio", BOOLEAN},
{"interpolation", STRING},
{"color", COLOR},
{"colorEnd", COLOR},
{"gradientType", STRING},
{"pillarboxes", BOOLEAN},
{"pillarboxThreshold", NORMALIZED_PAIR},
{"scanlines", BOOLEAN},

View file

@ -22,6 +22,9 @@
VideoComponent::VideoComponent()
: mVideoWidth {0}
, mVideoHeight {0}
, mColorShift {0xFFFFFFFF}
, mColorShiftEnd {0xFFFFFFFF}
, mColorGradientHorizontal {true}
, mTargetSize {0.0f, 0.0f}
, mVideoAreaPos {0.0f, 0.0f}
, mVideoAreaSize {0.0f, 0.0f}
@ -254,6 +257,29 @@ void VideoComponent::applyTheme(const std::shared_ptr<ThemeData>& theme,
}
}
if (elem->has("color")) {
mColorShift = elem->get<unsigned int>("color");
mColorShiftEnd = mColorShift;
}
if (elem->has("colorEnd"))
mColorShiftEnd = elem->get<unsigned int>("colorEnd");
if (elem->has("gradientType")) {
const std::string& gradientType {elem->get<std::string>("gradientType")};
if (gradientType == "horizontal") {
mColorGradientHorizontal = true;
}
else if (gradientType == "vertical") {
mColorGradientHorizontal = false;
}
else {
mColorGradientHorizontal = true;
LOG(LogWarning) << "VideoComponent: Invalid theme configuration, property "
"\"gradientType\" for element \""
<< element.substr(6) << "\" defined as \"" << gradientType << "\"";
}
}
if (elem->has("pillarboxes"))
mDrawPillarboxes = elem->get<bool>("pillarboxes");
@ -355,6 +381,12 @@ void VideoComponent::renderSnapshot(const glm::mat4& parentTrans)
if (mStaticImagePath != "") {
mStaticImage.setOpacity(mOpacity * mThemeOpacity);
mStaticImage.setSaturation(mSaturation * mThemeSaturation);
if (mColorShift != 0xFFFFFFFF)
mStaticImage.setColorShift(mColorShift);
if (mColorShift != mColorShiftEnd)
mStaticImage.setColorShiftEnd(mColorShiftEnd);
if (!mColorGradientHorizontal)
mStaticImage.setColorGradientHorizontal(mColorGradientHorizontal);
mStaticImage.setDimming(mDimming);
mStaticImage.render(parentTrans);
}

View file

@ -101,6 +101,9 @@ protected:
unsigned mVideoWidth;
unsigned mVideoHeight;
unsigned int mColorShift;
unsigned int mColorShiftEnd;
bool mColorGradientHorizontal;
glm::vec2 mTargetSize;
glm::vec2 mVideoAreaPos;
glm::vec2 mVideoAreaSize;

View file

@ -164,6 +164,11 @@ void VideoFFmpegComponent::render(const glm::mat4& parentTrans)
vertices[3] = {{mSize.x + mRectangleOffset.x, mSize.y + + mRectangleOffset.y}, {1.0f, 1.0f}, 0xFFFFFFFF};
// clang-format on
vertices[0].color = mColorShift;
vertices[1].color = mColorGradientHorizontal ? mColorShift : mColorShiftEnd;
vertices[2].color = mColorGradientHorizontal ? mColorShiftEnd : mColorShift;
vertices[3].color = mColorShiftEnd;
// Round vertices.
for (int i = 0; i < 4; ++i)
vertices[i].position = glm::round(vertices[i].position);

View file

@ -30,10 +30,13 @@ precision mediump float;
uniform mat4 MVPMatrix;
in vec2 positionVertex;
in vec2 texCoordVertex;
in vec4 colorVertex;
uniform vec2 textureSize;
out vec2 texCoord;
out vec2 onex;
out vec2 oney;
out vec4 colorShift;
#define SourceSize vec4(textureSize, 1.0 / textureSize)
@ -43,6 +46,7 @@ void main()
texCoord = texCoordVertex;
onex = vec2(SourceSize.z, 0.0);
oney = vec2(0.0, SourceSize.w);
colorShift.abgr = colorVertex.rgba;
}
// Fragment section of code:
@ -59,6 +63,7 @@ uniform sampler2D textureSampler;
in vec2 texCoord;
in vec2 onex;
in vec2 oney;
in vec4 colorShift;
out vec4 FragColor;
#define SourceSize vec4(textureSize, 1.0 / textureSize)
@ -158,6 +163,10 @@ void main()
colorTemp = vec4(blendedColor, colorTemp.a);
}
// Color shift.
colorTemp.rgb *= colorShift.rgb;
colorTemp.a *= colorShift.a;
FragColor = vec4(colorTemp.rgb, colorTemp.a * opacity);
}
#endif