Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2008, Google Inc. All rights reserved. | 2 * Copyright (c) 2008, Google Inc. All rights reserved. |
| 3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> | 3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
| 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. | 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions are | 7 * modification, are permitted provided that the following conditions are |
| 8 * met: | 8 * met: |
| 9 * | 9 * |
| 10 * * Redistributions of source code must retain the above copyright | 10 * * Redistributions of source code must retain the above copyright |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 31 */ | 31 */ |
| 32 | 32 |
| 33 #include "platform/graphics/ColorSpace.h" | 33 #include "platform/graphics/ColorSpace.h" |
| 34 | 34 |
| 35 #include "platform/graphics/skia/SkiaUtils.h" | 35 #include "platform/graphics/skia/SkiaUtils.h" |
| 36 #include "public/platform/WebScreenInfo.h" | |
| 37 #include "third_party/skia/include/core/SkColorSpaceXform.h" | |
| 36 #include "third_party/skia/include/effects/SkTableColorFilter.h" | 38 #include "third_party/skia/include/effects/SkTableColorFilter.h" |
| 37 #include "wtf/MathExtras.h" | 39 #include "wtf/MathExtras.h" |
| 38 #include <algorithm> | 40 #include <algorithm> |
| 39 | 41 |
| 40 namespace blink { | 42 namespace blink { |
| 41 | 43 |
| 42 namespace ColorSpaceUtilities { | 44 namespace ColorSpaceUtilities { |
| 43 | 45 |
| 44 static const uint8_t* getLinearRgbLUT() { | 46 static const uint8_t* getLinearRgbLUT() { |
| 45 static uint8_t linearRgbLUT[256]; | 47 static uint8_t linearRgbLUT[256]; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 | 111 |
| 110 sk_sp<SkColorFilter> createColorSpaceFilter(ColorSpace srcColorSpace, | 112 sk_sp<SkColorFilter> createColorSpaceFilter(ColorSpace srcColorSpace, |
| 111 ColorSpace dstColorSpace) { | 113 ColorSpace dstColorSpace) { |
| 112 const uint8_t* lookupTable = getConversionLUT(dstColorSpace, srcColorSpace); | 114 const uint8_t* lookupTable = getConversionLUT(dstColorSpace, srcColorSpace); |
| 113 if (!lookupTable) | 115 if (!lookupTable) |
| 114 return nullptr; | 116 return nullptr; |
| 115 | 117 |
| 116 return SkTableColorFilter::MakeARGB(0, lookupTable, lookupTable, lookupTable); | 118 return SkTableColorFilter::MakeARGB(0, lookupTable, lookupTable, lookupTable); |
| 117 } | 119 } |
| 118 | 120 |
| 121 ColorSpaceGamut getColorSpaceGamut(const WebScreenInfo& screenInfo) { | |
| 122 const gfx::ICCProfile& profile = screenInfo.iccProfile; | |
| 123 if (profile == gfx::ICCProfile()) | |
| 124 return ColorSpaceGamut::Unknown; | |
| 125 | |
| 126 return ColorSpaceUtilities::getColorSpaceGamut( | |
| 127 profile.GetColorSpace().ToSkColorSpace().get()); | |
| 128 } | |
| 129 | |
| 130 ColorSpaceGamut getColorSpaceGamut(SkColorSpace* colorSpace) { | |
|
Noel Gordon
2017/01/31 02:29:57
The color profile media spec does not say how to c
| |
| 131 sk_sp<SkColorSpace> scRGB( | |
| 132 SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named)); | |
| 133 std::unique_ptr<SkColorSpaceXform> transform( | |
| 134 SkColorSpaceXform::New(colorSpace, scRGB.get())); | |
| 135 | |
| 136 if (!transform) | |
| 137 return ColorSpaceGamut::Unknown; | |
| 138 | |
| 139 unsigned char in[3][4]; | |
| 140 float out[3][4]; | |
| 141 memset(in, 0, sizeof(in)); | |
| 142 in[0][0] = 255; | |
| 143 in[1][1] = 255; | |
| 144 in[2][2] = 255; | |
| 145 in[0][3] = 255; | |
| 146 in[1][3] = 255; | |
| 147 in[2][3] = 255; | |
| 148 transform->apply(SkColorSpaceXform::kRGBA_F32_ColorFormat, out, | |
| 149 SkColorSpaceXform::kRGBA_8888_ColorFormat, in, 3, | |
| 150 kOpaque_SkAlphaType); | |
| 151 float score = out[0][0] * out[1][1] * out[2][2]; | |
|
Noel Gordon
2017/01/31 02:29:57
Aside: by the looks, this appears to compute a sco
hubbe
2017/01/31 04:06:20
While I agree that this is a hacky method, I do th
| |
| 152 | |
| 153 if (score < 0.9) | |
| 154 return ColorSpaceGamut::LessThanNTSC; | |
| 155 if (score < 0.95) | |
| 156 return ColorSpaceGamut::NTSC; // actual score 0.912839 | |
| 157 if (score < 1.1) | |
| 158 return ColorSpaceGamut::SRGB; // actual score 1.0 | |
| 159 if (score < 1.3) | |
| 160 return ColorSpaceGamut::AlmostP3; | |
| 161 if (score < 1.425) | |
| 162 return ColorSpaceGamut::P3; // actual score 1.401899 | |
| 163 if (score < 1.5) | |
| 164 return ColorSpaceGamut::AdobeRGB; // actual score 1.458385 | |
| 165 if (score < 2.0) | |
| 166 return ColorSpaceGamut::Wide; | |
| 167 if (score < 2.2) | |
| 168 return ColorSpaceGamut::BT2020; // actual score 2.104520 | |
| 169 if (score < 2.7) | |
| 170 return ColorSpaceGamut::ProPhoto; // actual score 2.913247 | |
| 171 return ColorSpaceGamut::UltraWide; | |
| 172 } | |
| 173 | |
| 119 } // namespace ColorSpaceUtilities | 174 } // namespace ColorSpaceUtilities |
| 120 | 175 |
| 121 } // namespace blink | 176 } // namespace blink |
| OLD | NEW |