Add support for textures color space formats

[Issues 1479: pictures](https://github.com/thorvg/thorvg/issues/1479)

Formats supported:
    ABGR8888
    ARGB8888
    ABGR8888S
    ARGB8888S
This commit is contained in:
Sergii Liebodkin 2023-11-19 22:53:45 +02:00 committed by Hermet Park
parent cf8cba8f7b
commit 51e98eebdb
4 changed files with 25 additions and 7 deletions

View file

@ -27,11 +27,12 @@
// WgPipelineDataImage
//************************************************************************
void WgPipelineDataImage::updateFormat(const ColorSpace format) {
uColorInfo.format = (uint32_t)format;
}
void WgPipelineDataImage::updateOpacity(const uint8_t opacity) {
uColorInfo.color[0] = 1.0f; // red
uColorInfo.color[1] = 1.0f; // green
uColorInfo.color[2] = 1.0f; // blue
uColorInfo.color[3] = opacity / 255.0f; // alpha
uColorInfo.opacity = opacity / 255.0f; // alpha
}
//************************************************************************

View file

@ -28,12 +28,16 @@
class WgPipelineImage;
struct WgPipelineImageColorInfo {
float color[4]{};
uint32_t format{};
float dummy0{};
float dummy1{};
float opacity{};
};
struct WgPipelineDataImage: WgPipelineData {
WgPipelineImageColorInfo uColorInfo{}; // @binding(1)
void updateFormat(const ColorSpace format);
void updateOpacity(const uint8_t opacity);
};

View file

@ -189,6 +189,7 @@ RenderData WgRenderer::prepare(Surface* surface, const RenderMesh* mesh, RenderD
if (flags & (RenderUpdateFlag::Color | RenderUpdateFlag::Image | RenderUpdateFlag::Transform)) {
WgPipelineDataImage pipelineDataImage{};
pipelineDataImage.updateMatrix(mViewMatrix, transform);
pipelineDataImage.updateFormat(surface->cs);
pipelineDataImage.updateOpacity(opacity);
renderDataShape->mPipelineBindGroupImage.update(mQueue, pipelineDataImage, surface);
renderDataShape->tesselate(mDevice, mQueue, surface, mesh);

View file

@ -281,7 +281,10 @@ struct Matrix {
// ColorInfo
struct ColorInfo {
color: vec4f
format: u32,
dummy0: f32,
dummy1: f32,
opacity: f32
};
// vertex output
@ -312,5 +315,14 @@ fn vs_main(in: VertexInput) -> VertexOutput {
@fragment
fn fs_main(in: VertexOutput) -> @location(0) vec4f {
var color: vec4f = textureSample(uTextureViewBase, uSamplerBase, in.texCoords.xy);
return vec4f(color.rgb, color.a * uColorInfo.color.a);
var result: vec4f = color;
var format: u32 = uColorInfo.format;
if (format == 1u) { /* FMT_ARGB8888 */
result = color.bgra;
} else if (format == 2u) { /* FMT_ABGR8888S */
result = vec4(color.rgb * color.a, color.a);
} else if (format == 3u) { /* FMT_ARGB8888S */
result = vec4(color.bgr * color.a, color.a);
}
return vec4f(result.rgb, result.a * uColorInfo.opacity);
})";