egg: Add (discouraged) way to specify sRGB texture format (#924)

This should NOT be used by exporters, but is provided only for the sake of round-trippability of .bam files.
This commit is contained in:
rdb 2020-09-06 14:44:44 +02:00
parent cd435ecec8
commit ad0e634292
4 changed files with 29 additions and 1 deletions

View File

@ -509,6 +509,7 @@ has_alpha_channel(int num_components) const {
case F_rgb8: case F_rgb8:
case F_rgb5: case F_rgb5:
case F_rgb332: case F_rgb332:
case F_srgb:
// These formats never use alpha, regardless of the number of components // These formats never use alpha, regardless of the number of components
// we have. // we have.
return false; return false;
@ -525,6 +526,7 @@ has_alpha_channel(int num_components) const {
case F_rgba8: case F_rgba8:
case F_rgba4: case F_rgba4:
case F_rgba5: case F_rgba5:
case F_srgb_alpha:
case F_unspecified: case F_unspecified:
// These formats use alpha if the image had alpha. // These formats use alpha if the image had alpha.
return (num_components == 2 || num_components == 4); return (num_components == 2 || num_components == 4);
@ -690,6 +692,8 @@ EggTexture::Format EggTexture::
string_format(const string &string) { string_format(const string &string) {
if (cmp_nocase_uh(string, "rgba") == 0) { if (cmp_nocase_uh(string, "rgba") == 0) {
return F_rgba; return F_rgba;
} else if (cmp_nocase_uh(string, "srgb_alpha") == 0) {
return F_srgb_alpha;
} else if (cmp_nocase_uh(string, "rgbm") == 0) { } else if (cmp_nocase_uh(string, "rgbm") == 0) {
return F_rgbm; return F_rgbm;
} else if (cmp_nocase_uh(string, "rgba12") == 0) { } else if (cmp_nocase_uh(string, "rgba12") == 0) {
@ -701,6 +705,8 @@ string_format(const string &string) {
} else if (cmp_nocase_uh(string, "rgb") == 0) { } else if (cmp_nocase_uh(string, "rgb") == 0) {
return F_rgb; return F_rgb;
} else if (cmp_nocase_uh(string, "srgb") == 0) {
return F_srgb;
} else if (cmp_nocase_uh(string, "rgb12") == 0) { } else if (cmp_nocase_uh(string, "rgb12") == 0) {
return F_rgb12; return F_rgb12;
} else if (cmp_nocase_uh(string, "rgb8") == 0) { } else if (cmp_nocase_uh(string, "rgb8") == 0) {
@ -1137,6 +1143,8 @@ ostream &operator << (ostream &out, EggTexture::Format format) {
return out << "rgba8"; return out << "rgba8";
case EggTexture::F_rgba4: case EggTexture::F_rgba4:
return out << "rgba4"; return out << "rgba4";
case EggTexture::F_srgb_alpha:
return out << "srgb_alpha";
case EggTexture::F_rgb: case EggTexture::F_rgb:
return out << "rgb"; return out << "rgb";
@ -1150,6 +1158,8 @@ ostream &operator << (ostream &out, EggTexture::Format format) {
return out << "rgba5"; return out << "rgba5";
case EggTexture::F_rgb332: case EggTexture::F_rgb332:
return out << "rgb332"; return out << "rgb332";
case EggTexture::F_srgb:
return out << "srgb";
case EggTexture::F_red: case EggTexture::F_red:
return out << "red"; return out << "red";

View File

@ -60,7 +60,10 @@ PUBLISHED:
F_rgba, F_rgbm, F_rgba12, F_rgba8, F_rgba4, F_rgba5, F_rgba, F_rgbm, F_rgba12, F_rgba8, F_rgba4, F_rgba5,
F_rgb, F_rgb12, F_rgb8, F_rgb5, F_rgb332, F_rgb, F_rgb12, F_rgb8, F_rgb5, F_rgb332,
F_red, F_green, F_blue, F_alpha, F_luminance, F_red, F_green, F_blue, F_alpha, F_luminance,
F_luminance_alpha, F_luminance_alphamask F_luminance_alpha, F_luminance_alphamask,
// Only for compatibility with .bam, use is discouraged!
F_srgb, F_srgb_alpha
}; };
enum CompressionMode { enum CompressionMode {
CM_default, CM_off, CM_on, CM_default, CM_off, CM_on,

View File

@ -900,6 +900,7 @@ load_texture(TextureDef &def, EggTexture *egg_tex) {
case EggTexture::F_rgb8: case EggTexture::F_rgb8:
case EggTexture::F_rgb5: case EggTexture::F_rgb5:
case EggTexture::F_rgb332: case EggTexture::F_rgb332:
case EggTexture::F_srgb:
wanted_channels = 3; wanted_channels = 3;
wanted_alpha = false; wanted_alpha = false;
break; break;
@ -910,6 +911,7 @@ load_texture(TextureDef &def, EggTexture *egg_tex) {
case EggTexture::F_rgba8: case EggTexture::F_rgba8:
case EggTexture::F_rgba4: case EggTexture::F_rgba4:
case EggTexture::F_rgba5: case EggTexture::F_rgba5:
case EggTexture::F_srgb_alpha:
wanted_channels = 4; wanted_channels = 4;
wanted_alpha = true; wanted_alpha = true;
break; break;
@ -1259,6 +1261,10 @@ apply_texture_attributes(Texture *tex, const EggTexture *egg_tex) {
case EggTexture::F_rgb332: case EggTexture::F_rgb332:
tex->set_format(Texture::F_rgb332); tex->set_format(Texture::F_rgb332);
break; break;
case EggTexture::F_srgb:
case EggTexture::F_srgb_alpha:
tex->set_format(Texture::F_srgb);
break;
case EggTexture::F_unspecified: case EggTexture::F_unspecified:
break; break;
@ -1296,6 +1302,9 @@ apply_texture_attributes(Texture *tex, const EggTexture *egg_tex) {
case EggTexture::F_rgba5: case EggTexture::F_rgba5:
tex->set_format(Texture::F_rgba5); tex->set_format(Texture::F_rgba5);
break; break;
case EggTexture::F_srgb_alpha:
tex->set_format(Texture::F_srgb_alpha);
break;
case EggTexture::F_unspecified: case EggTexture::F_unspecified:
break; break;

View File

@ -1420,6 +1420,12 @@ get_egg_texture(Texture *tex) {
case Texture::F_luminance_alphamask: case Texture::F_luminance_alphamask:
temp.set_format(EggTexture::F_luminance_alphamask); temp.set_format(EggTexture::F_luminance_alphamask);
break; break;
case Texture::F_srgb:
temp.set_format(EggTexture::F_srgb);
break;
case Texture::F_srgb_alpha:
temp.set_format(EggTexture::F_srgb_alpha);
break;
default: default:
break; break;
} }