Skip to content

Commit 786e13a

Browse files
committed
Handle gray+alpha PNG images as gray+alpha sprites.
1 parent 1737075 commit 786e13a

File tree

9 files changed

+64
-13
lines changed

9 files changed

+64
-13
lines changed

core/2d/Sprite.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,25 @@ void Sprite::setTexture(Texture2D* texture)
434434
}
435435

436436
if (needsUpdatePS)
437-
setProgramState(backend::ProgramType::POSITION_TEXTURE_COLOR);
437+
{
438+
const PixelFormat pixelFormat = _texture->getPixelFormat();
439+
440+
switch(pixelFormat)
441+
{
442+
case PixelFormat::R8:
443+
setProgramState(backend::ProgramType::POSITION_TEXTURE_GRAY);
444+
break;
445+
case PixelFormat::RG8:
446+
setProgramState(backend::ProgramType::POSITION_TEXTURE_GRAY_ALPHA);
447+
break;
448+
case PixelFormat::RGBA8:
449+
setProgramState(backend::ProgramType::POSITION_TEXTURE_COLOR);
450+
break;
451+
default:
452+
AXLOGW("Warning: Sprite::setTexture() unhandled pixel format %d", (int)pixelFormat);
453+
setProgramState(backend::ProgramType::POSITION_TEXTURE_COLOR);
454+
}
455+
}
438456
else
439457
updateProgramStateTexture(_texture);
440458
}

core/platform/Image.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,7 +1314,8 @@ bool Image::initWithPngData(uint8_t* data, ssize_t dataLen)
13141314
png_read_end(png_ptr, nullptr);
13151315

13161316
// premultiplied alpha for RGBA8888
1317-
if ((color_type == PNG_COLOR_TYPE_RGB_ALPHA) || (color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
1317+
if ((color_type == PNG_COLOR_TYPE_RGB_ALPHA)
1318+
|| (color_type == PNG_COLOR_TYPE_GRAY_ALPHA))
13181319
{
13191320
if (PNG_PREMULTIPLIED_ALPHA_ENABLED)
13201321
{
@@ -2635,7 +2636,7 @@ void Image::premultiplyAlpha()
26352636
for (int i = 0; i < _width * _height; i++)
26362637
{
26372638
uint8_t* p = _data + i * 2;
2638-
twoBytes[i] = ((p[0] * p[1] + 1) >> 8) | (p[1] << 8);
2639+
twoBytes[i] = ((p[0] * (p[1] + 1)) >> 8) | (p[1] << 8);
26392640
}
26402641
}
26412642

core/renderer/Shaders.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ AX_DLL const std::string_view positionTexture_frag = "positionTe
3939
AX_DLL const std::string_view positionTextureColor_vert = "positionTextureColor_vs"sv;
4040
AX_DLL const std::string_view positionTextureColor_frag = "positionTextureColor_fs"sv;
4141
AX_DLL const std::string_view positionTextureColorAlphaTest_frag = "positionTextureColorAlphaTest_fs"sv;
42+
AX_DLL const std::string_view positionTextureGray_frag = "positionTextureGray_fs"sv;
43+
AX_DLL const std::string_view positionTextureGrayAlpha_frag = "positionTextureGrayAlpha_fs"sv;
4244
AX_DLL const std::string_view label_normal_frag = "label_normal_fs"sv;
4345
AX_DLL const std::string_view label_outline_frag = "label_outline_fs"sv;
4446
AX_DLL const std::string_view label_distanceNormal_frag = "label_distanceNormal_fs"sv;

core/renderer/Shaders.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ extern AX_DLL const std::string_view positionTexture_frag;
4747
extern AX_DLL const std::string_view positionTextureColor_vert;
4848
extern AX_DLL const std::string_view positionTextureColor_frag;
4949
extern AX_DLL const std::string_view positionTextureColorAlphaTest_frag;
50+
extern AX_DLL const std::string_view positionTextureGray_frag;
51+
extern AX_DLL const std::string_view positionTextureGrayAlpha_frag;
5052
extern AX_DLL const std::string_view label_normal_frag;
5153
extern AX_DLL const std::string_view label_outline_frag;
5254
extern AX_DLL const std::string_view label_distanceNormal_frag;

core/renderer/Texture2D.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -236,16 +236,6 @@ bool Texture2D::updateWithImage(Image* image, backend::PixelFormat format, int i
236236
default:
237237
break;
238238
}
239-
#elif !AX_GLES_PROFILE
240-
// Non-GLES doesn't support follow render formats, needs convert PixelFormat::RGBA8
241-
// Note: axmol-1.1 deprecated A8, L8, LA8 as renderFormat, preferred R8, RG8
242-
switch (renderFormat)
243-
{
244-
case PixelFormat::R8:
245-
case PixelFormat::RG8:
246-
// Note: conversion to RGBA8 will happends
247-
renderFormat = PixelFormat::RGBA8;
248-
}
249239
#endif
250240

251241
if (image->getNumberOfMipmaps() > 1)

core/renderer/backend/Enums.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ struct ProgramType
343343
POSITION_TEXTURE, // positionTexture_vert, positionTexture_frag
344344
POSITION_TEXTURE_COLOR, // positionTextureColor_vert, positionTextureColor_frag
345345
POSITION_TEXTURE_COLOR_ALPHA_TEST, // positionTextureColor_vert, positionTextureColorAlphaTest_frag
346+
POSITION_TEXTURE_GRAY_ALPHA, // positionTextureColor_vert, positionTextureGrayAlpha_frag
347+
POSITION_TEXTURE_GRAY, // positionTextureColor_vert, positionTextureGray_frag
346348
LABEL_NORMAL, // positionTextureColor_vert, label_normal_frag
347349
LABLE_OUTLINE, // positionTextureColor_vert, labelOutline_frag
348350
LABEL_DISTANCE_NORMAL, // positionTextureColor_vert, label_distanceNormal_frag

core/renderer/backend/ProgramManager.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ bool ProgramManager::init()
115115
VertexLayoutType::Texture);
116116
registerProgram(ProgramType::POSITION_TEXTURE_COLOR_ALPHA_TEST, positionTextureColor_vert,
117117
positionTextureColorAlphaTest_frag, VertexLayoutType::Sprite);
118+
registerProgram(ProgramType::POSITION_TEXTURE_GRAY_ALPHA, positionTextureColor_vert,
119+
positionTextureGrayAlpha_frag, VertexLayoutType::Sprite);
120+
registerProgram(ProgramType::POSITION_TEXTURE_GRAY, positionTextureColor_vert,
121+
positionTextureGray_frag, VertexLayoutType::Sprite);
118122
registerProgram(ProgramType::POSITION_UCOLOR, positionUColor_vert, positionColor_frag, VertexLayoutType::Pos);
119123
registerProgram(ProgramType::DUAL_SAMPLER_GRAY, positionTextureColor_vert, dualSampler_gray_frag,
120124
VertexLayoutType::Sprite);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#version 310 es
2+
precision highp float;
3+
precision highp int;
4+
5+
layout(location = COLOR0) in vec4 v_color;
6+
layout(location = TEXCOORD0) in vec2 v_texCoord;
7+
8+
layout(binding = 0) uniform sampler2D u_tex0;
9+
10+
layout(location = SV_Target0) out vec4 FragColor;
11+
12+
void main()
13+
{
14+
vec4 c = texture(u_tex0, v_texCoord);
15+
FragColor = v_color * vec4(c.r, c.r, c.r, 1);
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#version 310 es
2+
precision highp float;
3+
precision highp int;
4+
5+
layout(location = COLOR0) in vec4 v_color;
6+
layout(location = TEXCOORD0) in vec2 v_texCoord;
7+
8+
layout(binding = 0) uniform sampler2D u_tex0;
9+
10+
layout(location = SV_Target0) out vec4 FragColor;
11+
12+
void main()
13+
{
14+
vec4 c = texture(u_tex0, v_texCoord);
15+
FragColor = v_color * vec4(c.r, c.r, c.r, c.g);
16+
}

0 commit comments

Comments
 (0)