Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/graphics/gpu/WebGLImageConversion.h" | 5 #include "platform/graphics/gpu/WebGLImageConversion.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include "platform/graphics/ImageObserver.h" | 8 #include "platform/graphics/ImageObserver.h" |
| 9 #include "platform/graphics/cpu/arm/WebGLImageConversionNEON.h" | 9 #include "platform/graphics/cpu/arm/WebGLImageConversionNEON.h" |
| 10 #include "platform/graphics/cpu/mips/WebGLImageConversionMSA.h" | 10 #include "platform/graphics/cpu/mips/WebGLImageConversionMSA.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 58 break; | 58 break; |
| 59 case GL_RGB: | 59 case GL_RGB: |
| 60 case GL_RGB_INTEGER: | 60 case GL_RGB_INTEGER: |
| 61 dstFormat = WebGLImageConversion::DataFormatRGB8_S; | 61 dstFormat = WebGLImageConversion::DataFormatRGB8_S; |
| 62 break; | 62 break; |
| 63 case GL_RGBA: | 63 case GL_RGBA: |
| 64 case GL_RGBA_INTEGER: | 64 case GL_RGBA_INTEGER: |
| 65 dstFormat = WebGLImageConversion::DataFormatRGBA8_S; | 65 dstFormat = WebGLImageConversion::DataFormatRGBA8_S; |
| 66 break; | 66 break; |
| 67 default: | 67 default: |
| 68 ASSERT_NOT_REACHED(); | 68 NOTREACHED(); |
| 69 } | 69 } |
| 70 break; | 70 break; |
| 71 case GL_UNSIGNED_BYTE: | 71 case GL_UNSIGNED_BYTE: |
| 72 switch (destinationFormat) { | 72 switch (destinationFormat) { |
| 73 case GL_RGB: | 73 case GL_RGB: |
| 74 case GL_RGB_INTEGER: | 74 case GL_RGB_INTEGER: |
| 75 case GL_SRGB_EXT: | 75 case GL_SRGB_EXT: |
| 76 dstFormat = WebGLImageConversion::DataFormatRGB8; | 76 dstFormat = WebGLImageConversion::DataFormatRGB8; |
| 77 break; | 77 break; |
| 78 case GL_RGBA: | 78 case GL_RGBA: |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 89 dstFormat = WebGLImageConversion::DataFormatR8; | 89 dstFormat = WebGLImageConversion::DataFormatR8; |
| 90 break; | 90 break; |
| 91 case GL_RG: | 91 case GL_RG: |
| 92 case GL_RG_INTEGER: | 92 case GL_RG_INTEGER: |
| 93 dstFormat = WebGLImageConversion::DataFormatRG8; | 93 dstFormat = WebGLImageConversion::DataFormatRG8; |
| 94 break; | 94 break; |
| 95 case GL_LUMINANCE_ALPHA: | 95 case GL_LUMINANCE_ALPHA: |
| 96 dstFormat = WebGLImageConversion::DataFormatRA8; | 96 dstFormat = WebGLImageConversion::DataFormatRA8; |
| 97 break; | 97 break; |
| 98 default: | 98 default: |
| 99 ASSERT_NOT_REACHED(); | 99 NOTREACHED(); |
| 100 } | 100 } |
| 101 break; | 101 break; |
| 102 case GL_SHORT: | 102 case GL_SHORT: |
| 103 switch (destinationFormat) { | 103 switch (destinationFormat) { |
| 104 case GL_RED_INTEGER: | 104 case GL_RED_INTEGER: |
| 105 dstFormat = WebGLImageConversion::DataFormatR16_S; | 105 dstFormat = WebGLImageConversion::DataFormatR16_S; |
| 106 break; | 106 break; |
| 107 case GL_RG_INTEGER: | 107 case GL_RG_INTEGER: |
| 108 dstFormat = WebGLImageConversion::DataFormatRG16_S; | 108 dstFormat = WebGLImageConversion::DataFormatRG16_S; |
| 109 break; | 109 break; |
| 110 case GL_RGB_INTEGER: | 110 case GL_RGB_INTEGER: |
| 111 dstFormat = WebGLImageConversion::DataFormatRGB16_S; | 111 dstFormat = WebGLImageConversion::DataFormatRGB16_S; |
| 112 case GL_RGBA_INTEGER: | 112 case GL_RGBA_INTEGER: |
| 113 dstFormat = WebGLImageConversion::DataFormatRGBA16_S; | 113 dstFormat = WebGLImageConversion::DataFormatRGBA16_S; |
| 114 default: | 114 default: |
| 115 ASSERT_NOT_REACHED(); | 115 NOTREACHED(); |
| 116 } | 116 } |
| 117 break; | 117 break; |
| 118 case GL_UNSIGNED_SHORT: | 118 case GL_UNSIGNED_SHORT: |
| 119 switch (destinationFormat) { | 119 switch (destinationFormat) { |
| 120 case GL_RED_INTEGER: | 120 case GL_RED_INTEGER: |
| 121 dstFormat = WebGLImageConversion::DataFormatR16; | 121 dstFormat = WebGLImageConversion::DataFormatR16; |
| 122 break; | 122 break; |
| 123 case GL_DEPTH_COMPONENT: | 123 case GL_DEPTH_COMPONENT: |
| 124 dstFormat = WebGLImageConversion::DataFormatD16; | 124 dstFormat = WebGLImageConversion::DataFormatD16; |
| 125 break; | 125 break; |
| 126 case GL_RG_INTEGER: | 126 case GL_RG_INTEGER: |
| 127 dstFormat = WebGLImageConversion::DataFormatRG16; | 127 dstFormat = WebGLImageConversion::DataFormatRG16; |
| 128 break; | 128 break; |
| 129 case GL_RGB_INTEGER: | 129 case GL_RGB_INTEGER: |
| 130 dstFormat = WebGLImageConversion::DataFormatRGB16; | 130 dstFormat = WebGLImageConversion::DataFormatRGB16; |
| 131 break; | 131 break; |
| 132 case GL_RGBA_INTEGER: | 132 case GL_RGBA_INTEGER: |
| 133 dstFormat = WebGLImageConversion::DataFormatRGBA16; | 133 dstFormat = WebGLImageConversion::DataFormatRGBA16; |
| 134 break; | 134 break; |
| 135 default: | 135 default: |
| 136 ASSERT_NOT_REACHED(); | 136 NOTREACHED(); |
| 137 } | 137 } |
| 138 break; | 138 break; |
| 139 case GL_INT: | 139 case GL_INT: |
| 140 switch (destinationFormat) { | 140 switch (destinationFormat) { |
| 141 case GL_RED_INTEGER: | 141 case GL_RED_INTEGER: |
| 142 dstFormat = WebGLImageConversion::DataFormatR32_S; | 142 dstFormat = WebGLImageConversion::DataFormatR32_S; |
| 143 break; | 143 break; |
| 144 case GL_RG_INTEGER: | 144 case GL_RG_INTEGER: |
| 145 dstFormat = WebGLImageConversion::DataFormatRG32_S; | 145 dstFormat = WebGLImageConversion::DataFormatRG32_S; |
| 146 break; | 146 break; |
| 147 case GL_RGB_INTEGER: | 147 case GL_RGB_INTEGER: |
| 148 dstFormat = WebGLImageConversion::DataFormatRGB32_S; | 148 dstFormat = WebGLImageConversion::DataFormatRGB32_S; |
| 149 break; | 149 break; |
| 150 case GL_RGBA_INTEGER: | 150 case GL_RGBA_INTEGER: |
| 151 dstFormat = WebGLImageConversion::DataFormatRGBA32_S; | 151 dstFormat = WebGLImageConversion::DataFormatRGBA32_S; |
| 152 break; | 152 break; |
| 153 default: | 153 default: |
| 154 ASSERT_NOT_REACHED(); | 154 NOTREACHED(); |
| 155 } | 155 } |
| 156 break; | 156 break; |
| 157 case GL_UNSIGNED_INT: | 157 case GL_UNSIGNED_INT: |
| 158 switch (destinationFormat) { | 158 switch (destinationFormat) { |
| 159 case GL_RED_INTEGER: | 159 case GL_RED_INTEGER: |
| 160 dstFormat = WebGLImageConversion::DataFormatR32; | 160 dstFormat = WebGLImageConversion::DataFormatR32; |
| 161 break; | 161 break; |
| 162 case GL_DEPTH_COMPONENT: | 162 case GL_DEPTH_COMPONENT: |
| 163 dstFormat = WebGLImageConversion::DataFormatD32; | 163 dstFormat = WebGLImageConversion::DataFormatD32; |
| 164 break; | 164 break; |
| 165 case GL_RG_INTEGER: | 165 case GL_RG_INTEGER: |
| 166 dstFormat = WebGLImageConversion::DataFormatRG32; | 166 dstFormat = WebGLImageConversion::DataFormatRG32; |
| 167 break; | 167 break; |
| 168 case GL_RGB_INTEGER: | 168 case GL_RGB_INTEGER: |
| 169 dstFormat = WebGLImageConversion::DataFormatRGB32; | 169 dstFormat = WebGLImageConversion::DataFormatRGB32; |
| 170 break; | 170 break; |
| 171 case GL_RGBA_INTEGER: | 171 case GL_RGBA_INTEGER: |
| 172 dstFormat = WebGLImageConversion::DataFormatRGBA32; | 172 dstFormat = WebGLImageConversion::DataFormatRGBA32; |
| 173 break; | 173 break; |
| 174 default: | 174 default: |
| 175 ASSERT_NOT_REACHED(); | 175 NOTREACHED(); |
| 176 } | 176 } |
| 177 break; | 177 break; |
| 178 case GL_HALF_FLOAT_OES: // OES_texture_half_float | 178 case GL_HALF_FLOAT_OES: // OES_texture_half_float |
| 179 case GL_HALF_FLOAT: | 179 case GL_HALF_FLOAT: |
| 180 switch (destinationFormat) { | 180 switch (destinationFormat) { |
| 181 case GL_RGBA: | 181 case GL_RGBA: |
| 182 dstFormat = WebGLImageConversion::DataFormatRGBA16F; | 182 dstFormat = WebGLImageConversion::DataFormatRGBA16F; |
| 183 break; | 183 break; |
| 184 case GL_RGB: | 184 case GL_RGB: |
| 185 dstFormat = WebGLImageConversion::DataFormatRGB16F; | 185 dstFormat = WebGLImageConversion::DataFormatRGB16F; |
| 186 break; | 186 break; |
| 187 case GL_RG: | 187 case GL_RG: |
| 188 dstFormat = WebGLImageConversion::DataFormatRG16F; | 188 dstFormat = WebGLImageConversion::DataFormatRG16F; |
| 189 break; | 189 break; |
| 190 case GL_ALPHA: | 190 case GL_ALPHA: |
| 191 dstFormat = WebGLImageConversion::DataFormatA16F; | 191 dstFormat = WebGLImageConversion::DataFormatA16F; |
| 192 break; | 192 break; |
| 193 case GL_LUMINANCE: | 193 case GL_LUMINANCE: |
| 194 case GL_RED: | 194 case GL_RED: |
| 195 dstFormat = WebGLImageConversion::DataFormatR16F; | 195 dstFormat = WebGLImageConversion::DataFormatR16F; |
| 196 break; | 196 break; |
| 197 case GL_LUMINANCE_ALPHA: | 197 case GL_LUMINANCE_ALPHA: |
| 198 dstFormat = WebGLImageConversion::DataFormatRA16F; | 198 dstFormat = WebGLImageConversion::DataFormatRA16F; |
| 199 break; | 199 break; |
| 200 default: | 200 default: |
| 201 ASSERT_NOT_REACHED(); | 201 NOTREACHED(); |
| 202 } | 202 } |
| 203 break; | 203 break; |
| 204 case GL_FLOAT: // OES_texture_float | 204 case GL_FLOAT: // OES_texture_float |
| 205 switch (destinationFormat) { | 205 switch (destinationFormat) { |
| 206 case GL_RGBA: | 206 case GL_RGBA: |
| 207 dstFormat = WebGLImageConversion::DataFormatRGBA32F; | 207 dstFormat = WebGLImageConversion::DataFormatRGBA32F; |
| 208 break; | 208 break; |
| 209 case GL_RGB: | 209 case GL_RGB: |
| 210 dstFormat = WebGLImageConversion::DataFormatRGB32F; | 210 dstFormat = WebGLImageConversion::DataFormatRGB32F; |
| 211 break; | 211 break; |
| 212 case GL_RG: | 212 case GL_RG: |
| 213 dstFormat = WebGLImageConversion::DataFormatRG32F; | 213 dstFormat = WebGLImageConversion::DataFormatRG32F; |
| 214 break; | 214 break; |
| 215 case GL_ALPHA: | 215 case GL_ALPHA: |
| 216 dstFormat = WebGLImageConversion::DataFormatA32F; | 216 dstFormat = WebGLImageConversion::DataFormatA32F; |
| 217 break; | 217 break; |
| 218 case GL_LUMINANCE: | 218 case GL_LUMINANCE: |
| 219 case GL_RED: | 219 case GL_RED: |
| 220 dstFormat = WebGLImageConversion::DataFormatR32F; | 220 dstFormat = WebGLImageConversion::DataFormatR32F; |
| 221 break; | 221 break; |
| 222 case GL_DEPTH_COMPONENT: | 222 case GL_DEPTH_COMPONENT: |
| 223 dstFormat = WebGLImageConversion::DataFormatD32F; | 223 dstFormat = WebGLImageConversion::DataFormatD32F; |
| 224 break; | 224 break; |
| 225 case GL_LUMINANCE_ALPHA: | 225 case GL_LUMINANCE_ALPHA: |
| 226 dstFormat = WebGLImageConversion::DataFormatRA32F; | 226 dstFormat = WebGLImageConversion::DataFormatRA32F; |
| 227 break; | 227 break; |
| 228 default: | 228 default: |
| 229 ASSERT_NOT_REACHED(); | 229 NOTREACHED(); |
| 230 } | 230 } |
| 231 break; | 231 break; |
| 232 case GL_UNSIGNED_SHORT_4_4_4_4: | 232 case GL_UNSIGNED_SHORT_4_4_4_4: |
| 233 dstFormat = WebGLImageConversion::DataFormatRGBA4444; | 233 dstFormat = WebGLImageConversion::DataFormatRGBA4444; |
| 234 break; | 234 break; |
| 235 case GL_UNSIGNED_SHORT_5_5_5_1: | 235 case GL_UNSIGNED_SHORT_5_5_5_1: |
| 236 dstFormat = WebGLImageConversion::DataFormatRGBA5551; | 236 dstFormat = WebGLImageConversion::DataFormatRGBA5551; |
| 237 break; | 237 break; |
| 238 case GL_UNSIGNED_SHORT_5_6_5: | 238 case GL_UNSIGNED_SHORT_5_6_5: |
| 239 dstFormat = WebGLImageConversion::DataFormatRGB565; | 239 dstFormat = WebGLImageConversion::DataFormatRGB565; |
| 240 break; | 240 break; |
| 241 case GL_UNSIGNED_INT_5_9_9_9_REV: | 241 case GL_UNSIGNED_INT_5_9_9_9_REV: |
| 242 dstFormat = WebGLImageConversion::DataFormatRGB5999; | 242 dstFormat = WebGLImageConversion::DataFormatRGB5999; |
| 243 break; | 243 break; |
| 244 case GL_UNSIGNED_INT_24_8: | 244 case GL_UNSIGNED_INT_24_8: |
| 245 dstFormat = WebGLImageConversion::DataFormatDS24_8; | 245 dstFormat = WebGLImageConversion::DataFormatDS24_8; |
| 246 break; | 246 break; |
| 247 case GL_UNSIGNED_INT_10F_11F_11F_REV: | 247 case GL_UNSIGNED_INT_10F_11F_11F_REV: |
| 248 dstFormat = WebGLImageConversion::DataFormatRGB10F11F11F; | 248 dstFormat = WebGLImageConversion::DataFormatRGB10F11F11F; |
| 249 break; | 249 break; |
| 250 case GL_UNSIGNED_INT_2_10_10_10_REV: | 250 case GL_UNSIGNED_INT_2_10_10_10_REV: |
| 251 dstFormat = WebGLImageConversion::DataFormatRGBA2_10_10_10; | 251 dstFormat = WebGLImageConversion::DataFormatRGBA2_10_10_10; |
| 252 break; | 252 break; |
| 253 default: | 253 default: |
| 254 ASSERT_NOT_REACHED(); | 254 NOTREACHED(); |
| 255 } | 255 } |
| 256 return dstFormat; | 256 return dstFormat; |
| 257 } | 257 } |
| 258 | 258 |
| 259 // The following Float to Half-Float conversion code is from the implementation | 259 // The following Float to Half-Float conversion code is from the implementation |
| 260 // of ftp://www.fox-toolkit.org/pub/fasthalffloatconversion.pdf, "Fast Half | 260 // of ftp://www.fox-toolkit.org/pub/fasthalffloatconversion.pdf, "Fast Half |
| 261 // Float Conversions" by Jeroen van der Zijp, November 2008 (Revised September | 261 // Float Conversions" by Jeroen van der Zijp, November 2008 (Revised September |
| 262 // 2010). Specially, the basetable[512] and shifttable[512] are generated as | 262 // 2010). Specially, the basetable[512] and shifttable[512] are generated as |
| 263 // follows: | 263 // follows: |
| 264 /* | 264 /* |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 393 // The following packing and unpacking routines are expressed in terms of | 393 // The following packing and unpacking routines are expressed in terms of |
| 394 // function templates and inline functions to achieve generality and speedup. | 394 // function templates and inline functions to achieve generality and speedup. |
| 395 // Explicit template specializations correspond to the cases that would occur. | 395 // Explicit template specializations correspond to the cases that would occur. |
| 396 // Some code are merged back from Mozilla code in | 396 // Some code are merged back from Mozilla code in |
| 397 // http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/WebGLTexelCo nversions.h | 397 // http://mxr.mozilla.org/mozilla-central/source/content/canvas/src/WebGLTexelCo nversions.h |
| 398 | 398 |
| 399 //---------------------------------------------------------------------- | 399 //---------------------------------------------------------------------- |
| 400 // Pixel unpacking routines. | 400 // Pixel unpacking routines. |
| 401 template <int format, typename SourceType, typename DstType> | 401 template <int format, typename SourceType, typename DstType> |
| 402 void unpack(const SourceType*, DstType*, unsigned) { | 402 void unpack(const SourceType*, DstType*, unsigned) { |
| 403 ASSERT_NOT_REACHED(); | 403 NOTREACHED(); |
| 404 } | 404 } |
| 405 | 405 |
| 406 template <> | 406 template <> |
| 407 void unpack<WebGLImageConversion::DataFormatARGB8, uint8_t, uint8_t>( | 407 void unpack<WebGLImageConversion::DataFormatARGB8, uint8_t, uint8_t>( |
| 408 const uint8_t* source, | 408 const uint8_t* source, |
| 409 uint8_t* destination, | 409 uint8_t* destination, |
| 410 unsigned pixelsPerRow) { | 410 unsigned pixelsPerRow) { |
| 411 for (unsigned i = 0; i < pixelsPerRow; ++i) { | 411 for (unsigned i = 0; i < pixelsPerRow; ++i) { |
| 412 destination[0] = source[1]; | 412 destination[0] = source[1]; |
| 413 destination[1] = source[2]; | 413 destination[1] = source[2]; |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 648 destination += 4; | 648 destination += 4; |
| 649 } | 649 } |
| 650 } | 650 } |
| 651 | 651 |
| 652 //---------------------------------------------------------------------- | 652 //---------------------------------------------------------------------- |
| 653 // Pixel packing routines. | 653 // Pixel packing routines. |
| 654 // | 654 // |
| 655 | 655 |
| 656 template <int format, int alphaOp, typename SourceType, typename DstType> | 656 template <int format, int alphaOp, typename SourceType, typename DstType> |
| 657 void pack(const SourceType*, DstType*, unsigned) { | 657 void pack(const SourceType*, DstType*, unsigned) { |
| 658 ASSERT_NOT_REACHED(); | 658 NOTREACHED(); |
| 659 } | 659 } |
| 660 | 660 |
| 661 template <> | 661 template <> |
| 662 void pack<WebGLImageConversion::DataFormatA8, | 662 void pack<WebGLImageConversion::DataFormatA8, |
| 663 WebGLImageConversion::AlphaDoNothing, | 663 WebGLImageConversion::AlphaDoNothing, |
| 664 uint8_t, | 664 uint8_t, |
| 665 uint8_t>(const uint8_t* source, | 665 uint8_t>(const uint8_t* source, |
| 666 uint8_t* destination, | 666 uint8_t* destination, |
| 667 unsigned pixelsPerRow) { | 667 unsigned pixelsPerRow) { |
| 668 for (unsigned i = 0; i < pixelsPerRow; ++i) { | 668 for (unsigned i = 0; i < pixelsPerRow; ++i) { |
| (...skipping 1578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2247 m_dstStart(dstStart), | 2247 m_dstStart(dstStart), |
| 2248 m_srcStride(srcStride), | 2248 m_srcStride(srcStride), |
| 2249 m_srcRowOffset(srcRowOffset), | 2249 m_srcRowOffset(srcRowOffset), |
| 2250 m_dstStride(dstStride), | 2250 m_dstStride(dstStride), |
| 2251 m_success(false) { | 2251 m_success(false) { |
| 2252 const unsigned MaxNumberOfComponents = 4; | 2252 const unsigned MaxNumberOfComponents = 4; |
| 2253 const unsigned MaxBytesPerComponent = 4; | 2253 const unsigned MaxBytesPerComponent = 4; |
| 2254 m_unpackedIntermediateSrcData = wrapArrayUnique( | 2254 m_unpackedIntermediateSrcData = wrapArrayUnique( |
| 2255 new uint8_t[m_srcSubRectangle.width() * MaxNumberOfComponents * | 2255 new uint8_t[m_srcSubRectangle.width() * MaxNumberOfComponents * |
| 2256 MaxBytesPerComponent]); | 2256 MaxBytesPerComponent]); |
| 2257 ASSERT(m_unpackedIntermediateSrcData.get()); | 2257 DCHECK(m_unpackedIntermediateSrcData.get()); |
| 2258 } | 2258 } |
| 2259 | 2259 |
| 2260 void convert(WebGLImageConversion::DataFormat srcFormat, | 2260 void convert(WebGLImageConversion::DataFormat srcFormat, |
| 2261 WebGLImageConversion::DataFormat dstFormat, | 2261 WebGLImageConversion::DataFormat dstFormat, |
| 2262 WebGLImageConversion::AlphaOp); | 2262 WebGLImageConversion::AlphaOp); |
| 2263 bool Success() const { return m_success; } | 2263 bool Success() const { return m_success; } |
| 2264 | 2264 |
| 2265 private: | 2265 private: |
| 2266 template <WebGLImageConversion::DataFormat SrcFormat> | 2266 template <WebGLImageConversion::DataFormat SrcFormat> |
| 2267 void convert(WebGLImageConversion::DataFormat dstFormat, | 2267 void convert(WebGLImageConversion::DataFormat dstFormat, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2300 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatARGB8) | 2300 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatARGB8) |
| 2301 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatABGR8) | 2301 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatABGR8) |
| 2302 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatAR8) | 2302 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatAR8) |
| 2303 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatBGRA8) | 2303 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatBGRA8) |
| 2304 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatRGBA5551) | 2304 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatRGBA5551) |
| 2305 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatRGBA4444) | 2305 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatRGBA4444) |
| 2306 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatRGBA32F) | 2306 FORMATCONVERTER_CASE_SRCFORMAT(WebGLImageConversion::DataFormatRGBA32F) |
| 2307 FORMATCONVERTER_CASE_SRCFORMAT( | 2307 FORMATCONVERTER_CASE_SRCFORMAT( |
| 2308 WebGLImageConversion::DataFormatRGBA2_10_10_10) | 2308 WebGLImageConversion::DataFormatRGBA2_10_10_10) |
| 2309 default: | 2309 default: |
| 2310 ASSERT_NOT_REACHED(); | 2310 NOTREACHED(); |
| 2311 } | 2311 } |
| 2312 #undef FORMATCONVERTER_CASE_SRCFORMAT | 2312 #undef FORMATCONVERTER_CASE_SRCFORMAT |
| 2313 } | 2313 } |
| 2314 | 2314 |
| 2315 template <WebGLImageConversion::DataFormat SrcFormat> | 2315 template <WebGLImageConversion::DataFormat SrcFormat> |
| 2316 void FormatConverter::convert(WebGLImageConversion::DataFormat dstFormat, | 2316 void FormatConverter::convert(WebGLImageConversion::DataFormat dstFormat, |
| 2317 WebGLImageConversion::AlphaOp alphaOp) { | 2317 WebGLImageConversion::AlphaOp alphaOp) { |
| 2318 #define FORMATCONVERTER_CASE_DSTFORMAT(DstFormat) \ | 2318 #define FORMATCONVERTER_CASE_DSTFORMAT(DstFormat) \ |
| 2319 case DstFormat: \ | 2319 case DstFormat: \ |
| 2320 return convert<SrcFormat, DstFormat>(alphaOp); | 2320 return convert<SrcFormat, DstFormat>(alphaOp); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 2342 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA16) | 2342 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA16) |
| 2343 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA16_S) | 2343 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA16_S) |
| 2344 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA32) | 2344 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA32) |
| 2345 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA32_S) | 2345 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA32_S) |
| 2346 FORMATCONVERTER_CASE_DSTFORMAT( | 2346 FORMATCONVERTER_CASE_DSTFORMAT( |
| 2347 WebGLImageConversion::DataFormatRGBA2_10_10_10) | 2347 WebGLImageConversion::DataFormatRGBA2_10_10_10) |
| 2348 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG8) | 2348 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG8) |
| 2349 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG16F) | 2349 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG16F) |
| 2350 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG32F) | 2350 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG32F) |
| 2351 default: | 2351 default: |
| 2352 ASSERT_NOT_REACHED(); | 2352 NOTREACHED(); |
| 2353 } | 2353 } |
| 2354 | 2354 |
| 2355 #undef FORMATCONVERTER_CASE_DSTFORMAT | 2355 #undef FORMATCONVERTER_CASE_DSTFORMAT |
| 2356 } | 2356 } |
| 2357 | 2357 |
| 2358 template <WebGLImageConversion::DataFormat SrcFormat, | 2358 template <WebGLImageConversion::DataFormat SrcFormat, |
| 2359 WebGLImageConversion::DataFormat DstFormat> | 2359 WebGLImageConversion::DataFormat DstFormat> |
| 2360 void FormatConverter::convert(WebGLImageConversion::AlphaOp alphaOp) { | 2360 void FormatConverter::convert(WebGLImageConversion::AlphaOp alphaOp) { |
| 2361 #define FORMATCONVERTER_CASE_ALPHAOP(alphaOp) \ | 2361 #define FORMATCONVERTER_CASE_ALPHAOP(alphaOp) \ |
| 2362 case alphaOp: \ | 2362 case alphaOp: \ |
| 2363 return convert<SrcFormat, DstFormat, alphaOp>(); | 2363 return convert<SrcFormat, DstFormat, alphaOp>(); |
| 2364 | 2364 |
| 2365 switch (alphaOp) { | 2365 switch (alphaOp) { |
| 2366 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoNothing) | 2366 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoNothing) |
| 2367 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoPremultiply) | 2367 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoPremultiply) |
| 2368 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoUnmultiply) | 2368 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoUnmultiply) |
| 2369 default: | 2369 default: |
| 2370 ASSERT_NOT_REACHED(); | 2370 NOTREACHED(); |
| 2371 } | 2371 } |
| 2372 #undef FORMATCONVERTER_CASE_ALPHAOP | 2372 #undef FORMATCONVERTER_CASE_ALPHAOP |
| 2373 } | 2373 } |
| 2374 | 2374 |
| 2375 template <int Format> | 2375 template <int Format> |
| 2376 struct SupportsConversionFromDomElements { | 2376 struct SupportsConversionFromDomElements { |
| 2377 STATIC_ONLY(SupportsConversionFromDomElements); | 2377 STATIC_ONLY(SupportsConversionFromDomElements); |
| 2378 static const bool value = | 2378 static const bool value = |
| 2379 Format == WebGLImageConversion::DataFormatRGBA8 || | 2379 Format == WebGLImageConversion::DataFormatRGBA8 || |
| 2380 Format == WebGLImageConversion::DataFormatRGB8 || | 2380 Format == WebGLImageConversion::DataFormatRGB8 || |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 2397 }; | 2397 }; |
| 2398 | 2398 |
| 2399 template <WebGLImageConversion::DataFormat SrcFormat, | 2399 template <WebGLImageConversion::DataFormat SrcFormat, |
| 2400 WebGLImageConversion::DataFormat DstFormat, | 2400 WebGLImageConversion::DataFormat DstFormat, |
| 2401 WebGLImageConversion::AlphaOp alphaOp> | 2401 WebGLImageConversion::AlphaOp alphaOp> |
| 2402 void FormatConverter::convert() { | 2402 void FormatConverter::convert() { |
| 2403 // Many instantiations of this template function will never be entered, so we | 2403 // Many instantiations of this template function will never be entered, so we |
| 2404 // try to return immediately in these cases to avoid generating useless code. | 2404 // try to return immediately in these cases to avoid generating useless code. |
| 2405 if (SrcFormat == DstFormat && | 2405 if (SrcFormat == DstFormat && |
| 2406 alphaOp == WebGLImageConversion::AlphaDoNothing) { | 2406 alphaOp == WebGLImageConversion::AlphaDoNothing) { |
| 2407 ASSERT_NOT_REACHED(); | 2407 NOTREACHED(); |
| 2408 return; | 2408 return; |
| 2409 } | 2409 } |
| 2410 if (!IsFloatFormat<DstFormat>::value && IsFloatFormat<SrcFormat>::value) { | 2410 if (!IsFloatFormat<DstFormat>::value && IsFloatFormat<SrcFormat>::value) { |
| 2411 ASSERT_NOT_REACHED(); | 2411 NOTREACHED(); |
| 2412 return; | 2412 return; |
| 2413 } | 2413 } |
| 2414 | 2414 |
| 2415 // Only textures uploaded from DOM elements or ImageData can allow DstFormat | 2415 // Only textures uploaded from DOM elements or ImageData can allow DstFormat |
| 2416 // != SrcFormat. | 2416 // != SrcFormat. |
| 2417 const bool srcFormatComesFromDOMElementOrImageData = | 2417 const bool srcFormatComesFromDOMElementOrImageData = |
| 2418 WebGLImageConversion::srcFormatComeFromDOMElementOrImageData(SrcFormat); | 2418 WebGLImageConversion::srcFormatComeFromDOMElementOrImageData(SrcFormat); |
| 2419 if (!srcFormatComesFromDOMElementOrImageData && SrcFormat != DstFormat) { | 2419 if (!srcFormatComesFromDOMElementOrImageData && SrcFormat != DstFormat) { |
| 2420 ASSERT_NOT_REACHED(); | 2420 NOTREACHED(); |
| 2421 return; | 2421 return; |
| 2422 } | 2422 } |
| 2423 // Likewise, only textures uploaded from DOM elements or ImageData can | 2423 // Likewise, only textures uploaded from DOM elements or ImageData can |
| 2424 // possibly need to be unpremultiplied. | 2424 // possibly need to be unpremultiplied. |
| 2425 if (!srcFormatComesFromDOMElementOrImageData && | 2425 if (!srcFormatComesFromDOMElementOrImageData && |
| 2426 alphaOp == WebGLImageConversion::AlphaDoUnmultiply) { | 2426 alphaOp == WebGLImageConversion::AlphaDoUnmultiply) { |
| 2427 ASSERT_NOT_REACHED(); | 2427 NOTREACHED(); |
| 2428 return; | 2428 return; |
| 2429 } | 2429 } |
| 2430 if (srcFormatComesFromDOMElementOrImageData && | 2430 if (srcFormatComesFromDOMElementOrImageData && |
| 2431 alphaOp == WebGLImageConversion::AlphaDoUnmultiply && | 2431 alphaOp == WebGLImageConversion::AlphaDoUnmultiply && |
| 2432 !SupportsConversionFromDomElements<DstFormat>::value) { | 2432 !SupportsConversionFromDomElements<DstFormat>::value) { |
| 2433 ASSERT_NOT_REACHED(); | 2433 NOTREACHED(); |
| 2434 return; | 2434 return; |
| 2435 } | 2435 } |
| 2436 if ((!HasAlpha(SrcFormat) || !HasColor(SrcFormat) || !HasColor(DstFormat)) && | 2436 if ((!HasAlpha(SrcFormat) || !HasColor(SrcFormat) || !HasColor(DstFormat)) && |
| 2437 alphaOp != WebGLImageConversion::AlphaDoNothing) { | 2437 alphaOp != WebGLImageConversion::AlphaDoNothing) { |
| 2438 ASSERT_NOT_REACHED(); | 2438 NOTREACHED(); |
| 2439 return; | 2439 return; |
| 2440 } | 2440 } |
| 2441 // If converting DOM element data to UNSIGNED_INT_5_9_9_9_REV or | 2441 // If converting DOM element data to UNSIGNED_INT_5_9_9_9_REV or |
| 2442 // UNSIGNED_INT_10F_11F_11F_REV, we should always switch to FLOAT instead to | 2442 // UNSIGNED_INT_10F_11F_11F_REV, we should always switch to FLOAT instead to |
| 2443 // avoid unpacking/packing these two types. | 2443 // avoid unpacking/packing these two types. |
| 2444 if (srcFormatComesFromDOMElementOrImageData && SrcFormat != DstFormat && | 2444 if (srcFormatComesFromDOMElementOrImageData && SrcFormat != DstFormat && |
| 2445 (DstFormat == WebGLImageConversion::DataFormatRGB5999 || | 2445 (DstFormat == WebGLImageConversion::DataFormatRGB5999 || |
| 2446 DstFormat == WebGLImageConversion::DataFormatRGB10F11F11F)) { | 2446 DstFormat == WebGLImageConversion::DataFormatRGB10F11F11F)) { |
| 2447 ASSERT_NOT_REACHED(); | 2447 NOTREACHED(); |
| 2448 return; | 2448 return; |
| 2449 } | 2449 } |
| 2450 | 2450 |
| 2451 typedef typename DataTypeForFormat<SrcFormat>::Type SrcType; | 2451 typedef typename DataTypeForFormat<SrcFormat>::Type SrcType; |
| 2452 typedef typename DataTypeForFormat<DstFormat>::Type DstType; | 2452 typedef typename DataTypeForFormat<DstFormat>::Type DstType; |
| 2453 const int IntermFormat = IntermediateFormat<DstFormat>::value; | 2453 const int IntermFormat = IntermediateFormat<DstFormat>::value; |
| 2454 typedef typename DataTypeForFormat<IntermFormat>::Type IntermType; | 2454 typedef typename DataTypeForFormat<IntermFormat>::Type IntermType; |
| 2455 const ptrdiff_t srcStrideInElements = m_srcStride / sizeof(SrcType); | 2455 const ptrdiff_t srcStrideInElements = m_srcStride / sizeof(SrcType); |
| 2456 const ptrdiff_t dstStrideInElements = m_dstStride / sizeof(DstType); | 2456 const ptrdiff_t dstStrideInElements = m_dstStride / sizeof(DstType); |
| 2457 const bool trivialUnpack = SrcFormat == IntermFormat; | 2457 const bool trivialUnpack = SrcFormat == IntermFormat; |
| 2458 const bool trivialPack = DstFormat == IntermFormat && | 2458 const bool trivialPack = DstFormat == IntermFormat && |
| 2459 alphaOp == WebGLImageConversion::AlphaDoNothing; | 2459 alphaOp == WebGLImageConversion::AlphaDoNothing; |
| 2460 ASSERT(!trivialUnpack || !trivialPack); | 2460 DCHECK(!trivialUnpack || !trivialPack); |
| 2461 | 2461 |
| 2462 const SrcType* srcRowStart = | 2462 const SrcType* srcRowStart = |
| 2463 static_cast<const SrcType*>(static_cast<const void*>( | 2463 static_cast<const SrcType*>(static_cast<const void*>( |
| 2464 static_cast<const uint8_t*>(m_srcStart) + | 2464 static_cast<const uint8_t*>(m_srcStart) + |
| 2465 ((m_srcStride * m_srcSubRectangle.y()) + m_srcRowOffset))); | 2465 ((m_srcStride * m_srcSubRectangle.y()) + m_srcRowOffset))); |
| 2466 | 2466 |
| 2467 // If packing multiple images into a 3D texture, and flipY is true, | 2467 // If packing multiple images into a 3D texture, and flipY is true, |
| 2468 // then the sub-rectangle is pointing at the start of the | 2468 // then the sub-rectangle is pointing at the start of the |
| 2469 // "bottommost" of those images. Since the source pointer strides in | 2469 // "bottommost" of those images. Since the source pointer strides in |
| 2470 // the positive direction, we need to back it up to point at the | 2470 // the positive direction, we need to back it up to point at the |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2611 GLenum WebGLImageConversion::computeImageSizeInBytes( | 2611 GLenum WebGLImageConversion::computeImageSizeInBytes( |
| 2612 GLenum format, | 2612 GLenum format, |
| 2613 GLenum type, | 2613 GLenum type, |
| 2614 GLsizei width, | 2614 GLsizei width, |
| 2615 GLsizei height, | 2615 GLsizei height, |
| 2616 GLsizei depth, | 2616 GLsizei depth, |
| 2617 const PixelStoreParams& params, | 2617 const PixelStoreParams& params, |
| 2618 unsigned* imageSizeInBytes, | 2618 unsigned* imageSizeInBytes, |
| 2619 unsigned* paddingInBytes, | 2619 unsigned* paddingInBytes, |
| 2620 unsigned* skipSizeInBytes) { | 2620 unsigned* skipSizeInBytes) { |
| 2621 ASSERT(imageSizeInBytes); | 2621 DCHECK(imageSizeInBytes); |
| 2622 ASSERT(params.alignment == 1 || params.alignment == 2 || | 2622 DCHECK(params.alignment == 1 || params.alignment == 2 || |
| 2623 params.alignment == 4 || params.alignment == 8); | 2623 params.alignment == 4 || params.alignment == 8); |
| 2624 ASSERT(params.rowLength >= 0 && params.imageHeight >= 0); | 2624 DCHECK(params.rowLength >= 0 && params.imageHeight >= 0); |
|
tkent
2017/04/09 23:17:27
Split this into two DCHECKs.
Hwanseung Lee
2017/04/11 22:24:10
Done.
| |
| 2625 ASSERT(params.skipPixels >= 0 && params.skipRows >= 0 && | 2625 DCHECK(params.skipPixels >= 0 && params.skipRows >= 0 && |
|
tkent
2017/04/09 23:17:27
Split this into three DCHECKs.
Hwanseung Lee
2017/04/11 22:24:10
Done.
| |
| 2626 params.skipImages >= 0); | 2626 params.skipImages >= 0); |
| 2627 if (width < 0 || height < 0 || depth < 0) | 2627 if (width < 0 || height < 0 || depth < 0) |
| 2628 return GL_INVALID_VALUE; | 2628 return GL_INVALID_VALUE; |
| 2629 if (!width || !height || !depth) { | 2629 if (!width || !height || !depth) { |
| 2630 *imageSizeInBytes = 0; | 2630 *imageSizeInBytes = 0; |
| 2631 if (paddingInBytes) | 2631 if (paddingInBytes) |
| 2632 *paddingInBytes = 0; | 2632 *paddingInBytes = 0; |
| 2633 if (skipSizeInBytes) | 2633 if (skipSizeInBytes) |
| 2634 *skipSizeInBytes = 0; | 2634 *skipSizeInBytes = 0; |
| 2635 return GL_NO_ERROR; | 2635 return GL_NO_ERROR; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2727 ImageHtmlDomSource imageHtmlDomSource, | 2727 ImageHtmlDomSource imageHtmlDomSource, |
| 2728 bool premultiplyAlpha, | 2728 bool premultiplyAlpha, |
| 2729 bool ignoreColorSpace) { | 2729 bool ignoreColorSpace) { |
| 2730 m_image = image; | 2730 m_image = image; |
| 2731 m_imageHtmlDomSource = imageHtmlDomSource; | 2731 m_imageHtmlDomSource = imageHtmlDomSource; |
| 2732 extractImage(premultiplyAlpha, ignoreColorSpace); | 2732 extractImage(premultiplyAlpha, ignoreColorSpace); |
| 2733 } | 2733 } |
| 2734 | 2734 |
| 2735 void WebGLImageConversion::ImageExtractor::extractImage(bool premultiplyAlpha, | 2735 void WebGLImageConversion::ImageExtractor::extractImage(bool premultiplyAlpha, |
| 2736 bool ignoreColorSpace) { | 2736 bool ignoreColorSpace) { |
| 2737 ASSERT(!m_imagePixelLocker); | 2737 DCHECK(!m_imagePixelLocker); |
| 2738 | 2738 |
| 2739 if (!m_image) | 2739 if (!m_image) |
| 2740 return; | 2740 return; |
| 2741 | 2741 |
| 2742 sk_sp<SkImage> skiaImage = m_image->imageForCurrentFrame(); | 2742 sk_sp<SkImage> skiaImage = m_image->imageForCurrentFrame(); |
| 2743 SkImageInfo info = skiaImage ? SkImageInfo::MakeN32Premul(m_image->width(), | 2743 SkImageInfo info = skiaImage ? SkImageInfo::MakeN32Premul(m_image->width(), |
| 2744 m_image->height()) | 2744 m_image->height()) |
| 2745 : SkImageInfo::MakeUnknown(); | 2745 : SkImageInfo::MakeUnknown(); |
| 2746 m_alphaOp = AlphaDoNothing; | 2746 m_alphaOp = AlphaDoNothing; |
| 2747 bool hasAlpha = skiaImage ? !skiaImage->isOpaque() : true; | 2747 bool hasAlpha = skiaImage ? !skiaImage->isOpaque() : true; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2783 m_alphaOp = AlphaDoUnmultiply; | 2783 m_alphaOp = AlphaDoUnmultiply; |
| 2784 } | 2784 } |
| 2785 | 2785 |
| 2786 if (!skiaImage) | 2786 if (!skiaImage) |
| 2787 return; | 2787 return; |
| 2788 | 2788 |
| 2789 m_imageSourceFormat = SK_B32_SHIFT ? DataFormatRGBA8 : DataFormatBGRA8; | 2789 m_imageSourceFormat = SK_B32_SHIFT ? DataFormatRGBA8 : DataFormatBGRA8; |
| 2790 m_imageSourceUnpackAlignment = | 2790 m_imageSourceUnpackAlignment = |
| 2791 0; // FIXME: this seems to always be zero - why use at all? | 2791 0; // FIXME: this seems to always be zero - why use at all? |
| 2792 | 2792 |
| 2793 ASSERT(skiaImage->width() && skiaImage->height()); | 2793 DCHECK(skiaImage->width() && skiaImage->height()); |
|
tkent
2017/04/09 23:17:27
Split this into two DCHECKs.
Hwanseung Lee
2017/04/11 22:24:10
Done.
| |
| 2794 m_imageWidth = skiaImage->width(); | 2794 m_imageWidth = skiaImage->width(); |
| 2795 m_imageHeight = skiaImage->height(); | 2795 m_imageHeight = skiaImage->height(); |
| 2796 | 2796 |
| 2797 // Fail if the image was downsampled because of memory limits. | 2797 // Fail if the image was downsampled because of memory limits. |
| 2798 if (m_imageWidth != (unsigned)m_image->width() || | 2798 if (m_imageWidth != (unsigned)m_image->width() || |
| 2799 m_imageHeight != (unsigned)m_image->height()) | 2799 m_imageHeight != (unsigned)m_image->height()) |
| 2800 return; | 2800 return; |
| 2801 | 2801 |
| 2802 m_imagePixelLocker.emplace(std::move(skiaImage), info.alphaType(), | 2802 m_imagePixelLocker.emplace(std::move(skiaImage), info.alphaType(), |
| 2803 kN32_SkColorType); | 2803 kN32_SkColorType); |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3168 pack<WebGLImageConversion::DataFormatRGB565, | 3168 pack<WebGLImageConversion::DataFormatRGB565, |
| 3169 WebGLImageConversion::AlphaDoNothing>(srcRowStart, dstRowStart, | 3169 WebGLImageConversion::AlphaDoNothing>(srcRowStart, dstRowStart, |
| 3170 pixelsPerRow); | 3170 pixelsPerRow); |
| 3171 } break; | 3171 } break; |
| 3172 default: | 3172 default: |
| 3173 break; | 3173 break; |
| 3174 } | 3174 } |
| 3175 } | 3175 } |
| 3176 | 3176 |
| 3177 } // namespace blink | 3177 } // namespace blink |
| OLD | NEW |