Commit 487d1384 authored by hubbe's avatar hubbe Committed by Commit bot

color: Add histograms for gamut

Add histograms recording color gamut information about images and screens.

BUG=667431

Review-Url: https://codereview.chromium.org/2567983004
Cr-Commit-Position: refs/heads/master@{#438715}
parent be4115d3
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "platform/graphics/BitmapImageMetrics.h" #include "platform/graphics/BitmapImageMetrics.h"
#include "platform/Histogram.h" #include "platform/Histogram.h"
#include "third_party/skia/include/core/SkColorSpaceXform.h"
#include "wtf/Threading.h" #include "wtf/Threading.h"
#include "wtf/text/WTFString.h" #include "wtf/text/WTFString.h"
...@@ -42,18 +43,28 @@ void BitmapImageMetrics::countImageOrientation( ...@@ -42,18 +43,28 @@ void BitmapImageMetrics::countImageOrientation(
orientationHistogram.count(orientation); orientationHistogram.count(orientation);
} }
void BitmapImageMetrics::countImageGamma(SkColorSpace* colorSpace) { void BitmapImageMetrics::countImageGammaAndGamut(SkColorSpace* colorSpace) {
DEFINE_THREAD_SAFE_STATIC_LOCAL( DEFINE_THREAD_SAFE_STATIC_LOCAL(
EnumerationHistogram, gammaNamedHistogram, EnumerationHistogram, gammaNamedHistogram,
new EnumerationHistogram("Blink.ColorSpace.Source", GammaEnd)); new EnumerationHistogram("Blink.ColorSpace.Source", GammaEnd));
gammaNamedHistogram.count(getColorSpaceGamma(colorSpace)); gammaNamedHistogram.count(getColorSpaceGamma(colorSpace));
DEFINE_THREAD_SAFE_STATIC_LOCAL(
EnumerationHistogram, gamutNamedHistogram,
new EnumerationHistogram("Blink.ColorGamut.Source", GamutEnd));
gamutNamedHistogram.count(getColorSpaceGamut(colorSpace));
} }
void BitmapImageMetrics::countOutputGamma(SkColorSpace* colorSpace) { void BitmapImageMetrics::countOutputGammaAndGamut(SkColorSpace* colorSpace) {
DEFINE_THREAD_SAFE_STATIC_LOCAL( DEFINE_THREAD_SAFE_STATIC_LOCAL(
EnumerationHistogram, gammaNamedHistogram, EnumerationHistogram, gammaNamedHistogram,
new EnumerationHistogram("Blink.ColorSpace.Destination", GammaEnd)); new EnumerationHistogram("Blink.ColorSpace.Destination", GammaEnd));
gammaNamedHistogram.count(getColorSpaceGamma(colorSpace)); gammaNamedHistogram.count(getColorSpaceGamma(colorSpace));
DEFINE_THREAD_SAFE_STATIC_LOCAL(
EnumerationHistogram, gamutNamedHistogram,
new EnumerationHistogram("Blink.ColorGamut.Destination", GamutEnd));
gamutNamedHistogram.count(getColorSpaceGamut(colorSpace));
} }
BitmapImageMetrics::Gamma BitmapImageMetrics::getColorSpaceGamma( BitmapImageMetrics::Gamma BitmapImageMetrics::getColorSpaceGamma(
...@@ -71,4 +82,49 @@ BitmapImageMetrics::Gamma BitmapImageMetrics::getColorSpaceGamma( ...@@ -71,4 +82,49 @@ BitmapImageMetrics::Gamma BitmapImageMetrics::getColorSpaceGamma(
return gamma; return gamma;
} }
BitmapImageMetrics::Gamut BitmapImageMetrics::getColorSpaceGamut(
SkColorSpace* colorSpace) {
sk_sp<SkColorSpace> scRGB(
SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named));
std::unique_ptr<SkColorSpaceXform> transform(
SkColorSpaceXform::New(colorSpace, scRGB.get()));
if (!transform)
return GamutUnknown;
unsigned char in[3][4];
float out[3][4];
memset(in, 0, sizeof(in));
in[0][0] = 255;
in[1][1] = 255;
in[2][2] = 255;
in[0][3] = 255;
in[1][3] = 255;
in[2][3] = 255;
transform->apply(SkColorSpaceXform::kRGBA_F32_ColorFormat, out,
SkColorSpaceXform::kRGBA_8888_ColorFormat, in, 3,
kOpaque_SkAlphaType);
float score = out[0][0] * out[1][1] * out[2][2];
if (score < 0.9)
return GamutLessThanNTSC;
if (score < 0.95)
return GamutNTSC; // actual score 0.912839
if (score < 1.1)
return GamutSRGB; // actual score 1.0
if (score < 1.3)
return GamutAlmostP3;
if (score < 1.425)
return GamutP3; // actual score 1.401899
if (score < 1.5)
return GamutAdobeRGB; // actual score 1.458385
if (score < 2.0)
return GamutWide;
if (score < 2.2)
return GamutBT2020; // actual score 2.104520
if (score < 2.7)
return GamutProPhoto; // actual score 2.913247
return GamutUltraWide;
}
} // namespace blink } // namespace blink
...@@ -46,13 +46,30 @@ class PLATFORM_EXPORT BitmapImageMetrics { ...@@ -46,13 +46,30 @@ class PLATFORM_EXPORT BitmapImageMetrics {
GammaEnd = GammaNamed + 1, GammaEnd = GammaNamed + 1,
}; };
enum Gamut {
// Values synced with 'Gamut' in src/tools/metrics/histograms/histograms.xml
GamutUnknown = 0,
GamutLessThanNTSC = 1,
GamutNTSC = 2,
GamutSRGB = 3,
GamutAlmostP3 = 4,
GamutP3 = 5,
GamutAdobeRGB = 6,
GamutWide = 7,
GamutBT2020 = 8,
GamutProPhoto = 9,
GamutUltraWide = 10,
GamutEnd
};
static void countDecodedImageType(const String& type); static void countDecodedImageType(const String& type);
static void countImageOrientation(const ImageOrientationEnum); static void countImageOrientation(const ImageOrientationEnum);
static void countImageGamma(SkColorSpace*); static void countImageGammaAndGamut(SkColorSpace*);
static void countOutputGamma(SkColorSpace*); static void countOutputGammaAndGamut(SkColorSpace*);
private: private:
static Gamma getColorSpaceGamma(SkColorSpace*); static Gamma getColorSpaceGamma(SkColorSpace*);
static Gamut getColorSpaceGamut(SkColorSpace*);
}; };
} // namespace blink } // namespace blink
......
...@@ -35,7 +35,7 @@ void ColorBehavior::setGlobalTargetColorProfile( ...@@ -35,7 +35,7 @@ void ColorBehavior::setGlobalTargetColorProfile(
SkColorSpace::MakeICC(profile.data(), profile.size()).release(); SkColorSpace::MakeICC(profile.data(), profile.size()).release();
// UMA statistics. // UMA statistics.
BitmapImageMetrics::countOutputGamma(gTargetColorSpace); BitmapImageMetrics::countOutputGammaAndGamut(gTargetColorSpace);
} }
void ColorBehavior::setGlobalTargetColorSpaceForTesting( void ColorBehavior::setGlobalTargetColorSpaceForTesting(
......
...@@ -175,7 +175,7 @@ ImageFrame* ImageDecoder::frameBufferAtIndex(size_t index) { ...@@ -175,7 +175,7 @@ ImageFrame* ImageDecoder::frameBufferAtIndex(size_t index) {
} }
if (!m_hasHistogrammedColorSpace) { if (!m_hasHistogrammedColorSpace) {
BitmapImageMetrics::countImageGamma(m_embeddedColorSpace.get()); BitmapImageMetrics::countImageGammaAndGamut(m_embeddedColorSpace.get());
m_hasHistogrammedColorSpace = true; m_hasHistogrammedColorSpace = true;
} }
......
...@@ -88726,6 +88726,20 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries. ...@@ -88726,6 +88726,20 @@ http://cs/file:chrome/histograms.xml - but prefer this file for new entries.
<int value="10" label="GammaNamed"/> <int value="10" label="GammaNamed"/>
</enum> </enum>
<enum name="Gamut" type="int">
<int value="0" label="GamutUnknown"/>
<int value="1" label="GamutLessThanNTSC"/>
<int value="2" label="GamutNTSC"/>
<int value="3" label="GamutSRGB"/>
<int value="4" label="GamutAlmostP3"/>
<int value="5" label="GamutP3"/>
<int value="6" label="GamutAdobeRGB"/>
<int value="7" label="GamutWide"/>
<int value="8" label="GamutBT2020"/>
<int value="9" label="GamutProPhoto"/>
<int value="10" label="GamutUltraWide"/>
</enum>
<enum name="GarbageCollectionReason" type="int"> <enum name="GarbageCollectionReason" type="int">
<int value="0" label="kUnknown"/> <int value="0" label="kUnknown"/>
<int value="1" label="kAllocationFailure"/> <int value="1" label="kAllocationFailure"/>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment