webgpu: light/dark mask mode support

[issues 2608: light/dark mask](#2608)

* CompositeMethod::LightMask
* CompositeMethod::DarkMask
This commit is contained in:
Sergii Liebodkin 2024-08-09 07:24:29 +00:00 committed by Hermet Park
parent a4bbf14371
commit 132b22cb47
3 changed files with 16 additions and 4 deletions

View file

@ -40,7 +40,7 @@ private:
WGPUShaderModule shaderBlendSolid[14];
WGPUShaderModule shaderBlendGradient[14];
WGPUShaderModule shaderBlendImage[14];
WGPUShaderModule shaderCompose[10];
WGPUShaderModule shaderCompose[12];
WGPUShaderModule shaderCopy;
private:
// graphics pipeline layouts
@ -68,7 +68,7 @@ public:
WGPUComputePipeline blendSolid[14];
WGPUComputePipeline blendGradient[14];
WGPUComputePipeline blendImage[14];
WGPUComputePipeline compose[10];
WGPUComputePipeline compose[12];
WGPUComputePipeline copy;
private:
void releaseGraphicHandles(WgContext& context);

View file

@ -652,6 +652,14 @@ std::string cComposeEquation_DifferenceMask = WG_SHADER_SOURCE(
Rc = Sc;
Ra = Sa * (1.0 - Ma) + Ma * (1.0 - Sa);
);
std::string cComposeEquation_LightenMask = WG_SHADER_SOURCE(
Rc = Sc;
Ra = select(Ma, Sa, Sa > Ma);
);
std::string cComposeEquation_DarkenMask = WG_SHADER_SOURCE(
Rc = Sc;
Ra = select(Sa, Ma, Sa > Ma);
);
std::string cComposeFooter = WG_SHADER_SOURCE(
textureStore(imageTgt, id.xy, vec4f(Rc, Ra));
@ -668,8 +676,10 @@ std::string compose_AddMask = cComposeHeader + cComposeEquation_AddMask
std::string compose_SubtractMask = cComposeHeader + cComposeEquation_SubtractMask + cComposeFooter;
std::string compose_IntersectMask = cComposeHeader + cComposeEquation_IntersectMask + cComposeFooter;
std::string compose_DifferenceMask = cComposeHeader + cComposeEquation_DifferenceMask + cComposeFooter;
std::string compose_LightenMask = cComposeHeader + cComposeEquation_LightenMask + cComposeFooter;
std::string compose_DarkenMask = cComposeHeader + cComposeEquation_DarkenMask + cComposeFooter;
const char* cShaderSrc_Compose[10] {
const char* cShaderSrc_Compose[12] {
compose_None.c_str(),
compose_ClipPath.c_str(),
compose_AlphaMask.c_str(),
@ -680,6 +690,8 @@ const char* cShaderSrc_Compose[10] {
compose_SubtractMask.c_str(),
compose_IntersectMask.c_str(),
compose_DifferenceMask.c_str(),
compose_LightenMask.c_str(),
compose_DarkenMask.c_str()
};
const char* cShaderSrc_Copy = WG_SHADER_SOURCE(

View file

@ -36,7 +36,7 @@ extern const char* cShaderSrc_Blend_Solid[14];
extern const char* cShaderSrc_Blend_Solid[14];
extern const char* cShaderSrc_Blend_Gradient[14];
extern const char* cShaderSrc_Blend_Image[14];
extern const char* cShaderSrc_Compose[10];
extern const char* cShaderSrc_Compose[12];
extern const char* cShaderSrc_Copy;
#endif // _TVG_WG_SHEDER_SRC_H_