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

View file

@ -652,6 +652,14 @@ std::string cComposeEquation_DifferenceMask = WG_SHADER_SOURCE(
Rc = Sc; Rc = Sc;
Ra = Sa * (1.0 - Ma) + Ma * (1.0 - Sa); 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( std::string cComposeFooter = WG_SHADER_SOURCE(
textureStore(imageTgt, id.xy, vec4f(Rc, Ra)); 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_SubtractMask = cComposeHeader + cComposeEquation_SubtractMask + cComposeFooter;
std::string compose_IntersectMask = cComposeHeader + cComposeEquation_IntersectMask + cComposeFooter; std::string compose_IntersectMask = cComposeHeader + cComposeEquation_IntersectMask + cComposeFooter;
std::string compose_DifferenceMask = cComposeHeader + cComposeEquation_DifferenceMask + 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_None.c_str(),
compose_ClipPath.c_str(), compose_ClipPath.c_str(),
compose_AlphaMask.c_str(), compose_AlphaMask.c_str(),
@ -680,6 +690,8 @@ const char* cShaderSrc_Compose[10] {
compose_SubtractMask.c_str(), compose_SubtractMask.c_str(),
compose_IntersectMask.c_str(), compose_IntersectMask.c_str(),
compose_DifferenceMask.c_str(), compose_DifferenceMask.c_str(),
compose_LightenMask.c_str(),
compose_DarkenMask.c_str()
}; };
const char* cShaderSrc_Copy = WG_SHADER_SOURCE( 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_Solid[14];
extern const char* cShaderSrc_Blend_Gradient[14]; extern const char* cShaderSrc_Blend_Gradient[14];
extern const char* cShaderSrc_Blend_Image[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; extern const char* cShaderSrc_Copy;
#endif // _TVG_WG_SHEDER_SRC_H_ #endif // _TVG_WG_SHEDER_SRC_H_