Index: tools/flags/SkCommonFlagsConfig.cpp |
diff --git a/tools/flags/SkCommonFlagsConfig.cpp b/tools/flags/SkCommonFlagsConfig.cpp |
index cbacd5bf67fcfa900821ff17f91f2324811d8e3a..16ac114cfcae4fc1adeea43cc22eebe1c2cc077d 100644 |
--- a/tools/flags/SkCommonFlagsConfig.cpp |
+++ b/tools/flags/SkCommonFlagsConfig.cpp |
@@ -28,8 +28,8 @@ static const char defaultConfigs[] = |
static const char configHelp[] = |
"Options: 565 8888 debug gpu gl gpudebug gpudft gpunull " |
- "msaa16 msaa4 glmsaa4 gpuf16 gpusrgb glsrgb nonrendering null nullgpu " |
- "nvpr16 nvpr4 nvprdit16 nvprdit4 glnvpr4 glnvprdit4 pdf skp svg xps" |
+ "msaa16 msaa4 glmsaa4 gpuf16 gpusrgb glsrgb glwide nonrendering null nullgpu " |
+ "nvpr16 nvpr4 nvprdit16 nvprdit4 glnvpr4 glnvprdit4 pdf skp svg xps " |
"glinst glinst4 glinstdit4 glinst16 glinstdit16 esinst esinst4 esinsdit4" |
#if SK_ANGLE |
#ifdef SK_BUILD_FOR_WIN |
@@ -47,7 +47,7 @@ static const char configHelp[] = |
" hwui" |
#endif |
#ifdef SK_VULKAN |
- " vk vksrgb" |
+ " vk vksrgb vkwide" |
#endif |
" or use extended form 'backend(option=value,...)'.\n"; |
@@ -84,8 +84,13 @@ static const char configExtendedHelp[] = |
"\t Select framebuffer color format.\n" |
"\t Options:\n" |
"\t\t8888\t\t\tLinear 8888.\n" |
- "\t\tf16 \t\t\tLinear 16-bit floating point.\n" |
- "\t\tsrgb\t\t\tsRGB 8888.\n" |
+ "\t\tf16{_gamut}\t\tLinear 16-bit floating point.\n" |
+ "\t\tsrgb{_gamut}\t\tsRGB 8888.\n" |
+ "\t gamut\ttype: string\tdefault: srgb.\n" |
+ "\t Select color gamut for f16 or sRGB format buffers.\n" |
+ "\t Options:\n" |
+ "\t\tsrgb\t\t\tsRGB gamut.\n" |
+ "\t\twide\t\t\tWide Gamut RGB.\n" |
"\tdit\ttype: bool\tdefault: false.\n" |
"\t Use device independent text.\n" |
"\tnvpr\ttype: bool\tdefault: false.\n" |
@@ -108,6 +113,7 @@ static const char configExtendedHelp[] = |
"\tgpuf16 \t= gpu(color=f16)\n" |
"\tgpusrgb \t= gpu(color=srgb)\n" |
"\tglsrgb \t= gpu(api=gl,color=srgb)\n" |
+ "\tglwide \t= gpu(api=gl,color=f16_wide)\n" |
"\tgpudft \t= gpu(dit=true)\n" |
"\tgpudebug \t= gpu(api=debug)\n" |
"\tgpunull \t= gpu(api=null)\n" |
@@ -128,6 +134,7 @@ static const char configExtendedHelp[] = |
#ifdef SK_VULKAN |
"\tvk \t= gpu(api=vulkan)\n" |
"\tvksrgb \t= gpu(api=vulkan,color=srgb)\n" |
+ "\tvkwide \t= gpu(api=vulkan,color=f16_wide)\n" |
"\tvkmsaa4 \t= gpu(api=gl,samples=4)\n" |
"\tvkmsaa16 \t= gpu(api=gl,samples=16)\n" |
#endif |
@@ -164,6 +171,7 @@ static const struct { |
{ "gpuf16", "gpu", "color=f16" }, |
{ "gpusrgb", "gpu", "color=srgb" }, |
{ "glsrgb", "gpu", "api=gl,color=srgb" }, |
+ { "glwide", "gpu", "api=gl,color=f16_wide" }, |
{ "gpudft", "gpu", "dit=true" }, |
{ "gpudebug", "gpu", "api=debug" }, |
{ "gpunull", "gpu", "api=null" }, |
@@ -184,6 +192,7 @@ static const struct { |
#ifdef SK_VULKAN |
, { "vk", "gpu", "api=vulkan" } |
, { "vksrgb", "gpu", "api=vulkan,color=srgb" } |
+ , { "vkwide", "gpu", "api=vulkan,color=f16_wide" } |
, { "vkmsaa4", "gpu", "api=vulkan,samples=4" } |
, { "vkmsaa16", "gpu", "api=vulkan,samples=16" } |
#endif |
@@ -305,14 +314,44 @@ static bool parse_option_gpu_color(const SkString& value, |
*outColorSpace = nullptr; |
return true; |
} |
- if (value.equals("f16")) { |
+ |
+ SkTArray<SkString> commands; |
+ SkStrSplit(value.c_str(), "_", &commands); |
+ if (commands.count() < 1 || commands.count() > 2) { |
+ return false; |
+ } |
+ |
+ // First, figure out color gamut that we'll work in (default to sRGB) |
+ sk_sp<SkColorSpace> colorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); |
+ if (commands.count() == 2) { |
+ if (commands[1].equals("srgb")) { |
+ // sRGB gamut (which is our default) |
+ } else if (commands[1].equals("wide")) { |
+ // WideGamut RGB |
+ const float gWideGamutRGB_toXYZD50[]{ |
+ 0.7161046f, 0.1009296f, 0.1471858f, // -> X |
+ 0.2581874f, 0.7249378f, 0.0168748f, // -> Y |
+ 0.0000000f, 0.0517813f, 0.7734287f, // -> Z |
+ }; |
+ SkMatrix44 wideGamutRGBMatrix(SkMatrix44::kUninitialized_Constructor); |
+ wideGamutRGBMatrix.set3x3RowMajorf(gWideGamutRGB_toXYZD50); |
+ colorSpace = SkColorSpace::NewRGB(SkColorSpace::kSRGB_RenderTargetGamma, |
+ wideGamutRGBMatrix); |
+ } else { |
+ // Unknown color gamut |
+ return false; |
+ } |
+ } |
+ |
+ // Now pick a color type |
+ if (commands[0].equals("f16")) { |
*outColorType = kRGBA_F16_SkColorType; |
- *outColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)->makeLinearGamma(); |
+ *outColorSpace = colorSpace->makeLinearGamma(); |
return true; |
} |
- if (value.equals("srgb")) { |
+ if (commands[0].equals("srgb")) { |
*outColorType = kN32_SkColorType; |
- *outColorSpace = SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); |
+ *outColorSpace = colorSpace; |
return true; |
} |
return false; |