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 |