Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(243)

Side by Side Diff: Source/platform/graphics/gpu/WebGLImageConversion.cpp

Issue 1209803002: Upgrade WebGLImageConversion to ES3: Part III (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "config.h" 5 #include "config.h"
6 #include "platform/graphics/gpu/WebGLImageConversion.h" 6 #include "platform/graphics/gpu/WebGLImageConversion.h"
7 7
8 #include "platform/CheckedInt.h" 8 #include "platform/CheckedInt.h"
9 #include "platform/graphics/ImageObserver.h" 9 #include "platform/graphics/ImageObserver.h"
10 #include "platform/graphics/cpu/arm/WebGLImageConversionNEON.h" 10 #include "platform/graphics/cpu/arm/WebGLImageConversionNEON.h"
11 #include "platform/graphics/cpu/x86/WebGLImageConversionSSE.h" 11 #include "platform/graphics/cpu/x86/WebGLImageConversionSSE.h"
12 #include "platform/image-decoders/ImageDecoder.h" 12 #include "platform/image-decoders/ImageDecoder.h"
13 #include "wtf/OwnPtr.h" 13 #include "wtf/OwnPtr.h"
14 #include "wtf/PassOwnPtr.h" 14 #include "wtf/PassOwnPtr.h"
15 15
16 namespace blink { 16 namespace blink {
17 17
18 namespace { 18 namespace {
19 19
20 const float maxInt8Value = INT8_MAX;
21 const float maxUInt8Value = UINT8_MAX;
22 const float maxInt16Value = INT16_MAX;
23 const float maxUInt16Value = UINT16_MAX;
24 const double maxInt32Value = INT32_MAX;
25 const double maxUInt32Value = UINT32_MAX;
26
27 int8_t ClampMin(int8_t value)
28 {
29 const static int8_t minInt8Value = INT8_MIN + 1;
30 return value < minInt8Value ? minInt8Value : value;
31 }
32
33 int16_t ClampMin(int16_t value)
34 {
35 const static int16_t minInt16Value = INT16_MIN + 1;
36 return value < minInt16Value ? minInt16Value : value;
37 }
38
39 int32_t ClampMin(int32_t value)
40 {
41 const static int32_t minInt32Value = INT32_MIN + 1;
42 return value < minInt32Value ? minInt32Value : value;
43 }
44
20 WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum destinationType) 45 WebGLImageConversion::DataFormat getDataFormat(GLenum destinationFormat, GLenum destinationType)
21 { 46 {
22 WebGLImageConversion::DataFormat dstFormat = WebGLImageConversion::DataForma tRGBA8; 47 WebGLImageConversion::DataFormat dstFormat = WebGLImageConversion::DataForma tRGBA8;
23 switch (destinationType) { 48 switch (destinationType) {
24 case GL_BYTE: 49 case GL_BYTE:
25 switch (destinationFormat) { 50 switch (destinationFormat) {
26 case GL_RED: 51 case GL_RED:
27 case GL_RED_INTEGER: 52 case GL_RED_INTEGER:
28 dstFormat = WebGLImageConversion::DataFormatR8_S; 53 dstFormat = WebGLImageConversion::DataFormatR8_S;
29 break; 54 break;
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 for (unsigned i = 0; i < pixelsPerRow; ++i) { 559 for (unsigned i = 0; i < pixelsPerRow; ++i) {
535 destination[0] = source[0]; 560 destination[0] = source[0];
536 destination[1] = source[0]; 561 destination[1] = source[0];
537 destination[2] = source[0]; 562 destination[2] = source[0];
538 destination[3] = source[1]; 563 destination[3] = source[1];
539 source += 2; 564 source += 2;
540 destination += 4; 565 destination += 4;
541 } 566 }
542 } 567 }
543 568
544 template<> void unpack<WebGLImageConversion::DataFormatRGBA2_10_10_10, uint32_t, uint16_t>(const uint32_t* source, uint16_t* destination, unsigned pixelsPerRow) 569 template<> void unpack<WebGLImageConversion::DataFormatRGBA2_10_10_10, uint32_t, float>(const uint32_t* source, float* destination, unsigned pixelsPerRow)
545 { 570 {
546 // FIXME: Implement this. 571 static const float rgbScaleFactor = 1.0f / 1023.0f;
547 ASSERT_NOT_REACHED(); 572 static const float alphaScaleFactor = 1.0f / 3.0f;
573 for (unsigned i = 0; i < pixelsPerRow; ++i) {
574 uint32_t packedValue = source[0];
575 destination[0] = static_cast<float>(packedValue & 0x3FF) * rgbScaleFacto r;
576 destination[1] = static_cast<float>((packedValue >> 10) & 0x3FF) * rgbSc aleFactor;
577 destination[2] = static_cast<float>((packedValue >> 20) & 0x3FF) * rgbSc aleFactor;
578 destination[3] = static_cast<float>(packedValue >> 30) * alphaScaleFacto r;
579 source += 1;
580 destination += 4;
581 }
548 } 582 }
549 583
550 //---------------------------------------------------------------------- 584 //----------------------------------------------------------------------
551 // Pixel packing routines. 585 // Pixel packing routines.
552 // 586 //
553 587
554 template<int format, int alphaOp, typename SourceType, typename DstType> 588 template<int format, int alphaOp, typename SourceType, typename DstType>
555 void pack(const SourceType*, DstType*, unsigned) 589 void pack(const SourceType*, DstType*, unsigned)
556 { 590 {
557 ASSERT_NOT_REACHED(); 591 ASSERT_NOT_REACHED();
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 { 1159 {
1126 for (unsigned i = 0; i < pixelsPerRow; ++i) { 1160 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1127 destination[0] = convertFloatToHalfFloat(source[3]); 1161 destination[0] = convertFloatToHalfFloat(source[3]);
1128 source += 4; 1162 source += 4;
1129 destination += 1; 1163 destination += 1;
1130 } 1164 }
1131 } 1165 }
1132 1166
1133 template<> void pack<WebGLImageConversion::DataFormatRGBA8_S, WebGLImageConversi on::AlphaDoPremultiply, int8_t, int8_t>(const int8_t* source, int8_t* destinatio n, unsigned pixelsPerRow) 1167 template<> void pack<WebGLImageConversion::DataFormatRGBA8_S, WebGLImageConversi on::AlphaDoPremultiply, int8_t, int8_t>(const int8_t* source, int8_t* destinatio n, unsigned pixelsPerRow)
1134 { 1168 {
1135 // FIXME: Implement this. 1169 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1136 ASSERT_NOT_REACHED(); 1170 destination[3] = ClampMin(source[3]);
1137 } 1171 float scaleFactor = static_cast<float>(destination[3]) / maxInt8Value;
1138 1172 destination[0] = static_cast<int8_t>(static_cast<float>(ClampMin(source[ 0])) * scaleFactor);
1139 // FIXME: this routine is lossy and must be removed. 1173 destination[1] = static_cast<int8_t>(static_cast<float>(ClampMin(source[ 1])) * scaleFactor);
1140 template<> void pack<WebGLImageConversion::DataFormatRGBA8_S, WebGLImageConversi on::AlphaDoUnmultiply, int8_t, int8_t>(const int8_t* source, int8_t* destination , unsigned pixelsPerRow) 1174 destination[2] = static_cast<int8_t>(static_cast<float>(ClampMin(source[ 2])) * scaleFactor);
1141 { 1175 source += 4;
1142 // FIXME: Implement this. 1176 destination += 4;
1143 ASSERT_NOT_REACHED(); 1177 }
1144 } 1178 }
1145 1179
1146 template<> void pack<WebGLImageConversion::DataFormatRGBA16, WebGLImageConversio n::AlphaDoPremultiply, uint16_t, uint16_t>(const uint16_t* source, uint16_t* des tination, unsigned pixelsPerRow) 1180 template<> void pack<WebGLImageConversion::DataFormatRGBA16, WebGLImageConversio n::AlphaDoPremultiply, uint16_t, uint16_t>(const uint16_t* source, uint16_t* des tination, unsigned pixelsPerRow)
1147 { 1181 {
1148 // FIXME: Implement this. 1182 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1149 ASSERT_NOT_REACHED(); 1183 float scaleFactor = static_cast<float>(source[3]) / maxUInt16Value;
1150 } 1184 destination[0] = static_cast<uint16_t>(static_cast<float>(source[0]) * s caleFactor);
1151 1185 destination[1] = static_cast<uint16_t>(static_cast<float>(source[1]) * s caleFactor);
1152 // FIXME: this routine is lossy and must be removed. 1186 destination[2] = static_cast<uint16_t>(static_cast<float>(source[2]) * s caleFactor);
1153 template<> void pack<WebGLImageConversion::DataFormatRGBA16, WebGLImageConversio n::AlphaDoUnmultiply, uint16_t, uint16_t>(const uint16_t* source, uint16_t* dest ination, unsigned pixelsPerRow) 1187 destination[3] = source[3];
1154 { 1188 source += 4;
1155 // FIXME: Implement this. 1189 destination += 4;
1156 ASSERT_NOT_REACHED(); 1190 }
1157 } 1191 }
1158 1192
1159 template<> void pack<WebGLImageConversion::DataFormatRGBA16_S, WebGLImageConvers ion::AlphaDoPremultiply, int16_t, int16_t>(const int16_t* source, int16_t* desti nation, unsigned pixelsPerRow) 1193 template<> void pack<WebGLImageConversion::DataFormatRGBA16_S, WebGLImageConvers ion::AlphaDoPremultiply, int16_t, int16_t>(const int16_t* source, int16_t* desti nation, unsigned pixelsPerRow)
1160 { 1194 {
1161 // FIXME: Implement this. 1195 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1162 ASSERT_NOT_REACHED(); 1196 destination[3] = ClampMin(source[3]);
1163 } 1197 float scaleFactor = static_cast<float>(destination[3]) / maxInt16Value;
1164 1198 destination[0] = static_cast<int16_t>(static_cast<float>(ClampMin(source [0])) * scaleFactor);
1165 // FIXME: this routine is lossy and must be removed. 1199 destination[1] = static_cast<int16_t>(static_cast<float>(ClampMin(source [1])) * scaleFactor);
1166 template<> void pack<WebGLImageConversion::DataFormatRGBA16_S, WebGLImageConvers ion::AlphaDoUnmultiply, int16_t, int16_t>(const int16_t* source, int16_t* destin ation, unsigned pixelsPerRow) 1200 destination[2] = static_cast<int16_t>(static_cast<float>(ClampMin(source [2])) * scaleFactor);
1167 { 1201 source += 4;
1168 // FIXME: Implement this. 1202 destination += 4;
1169 ASSERT_NOT_REACHED(); 1203 }
1170 } 1204 }
1171 1205
1172 template<> void pack<WebGLImageConversion::DataFormatRGBA32, WebGLImageConversio n::AlphaDoPremultiply, uint32_t, uint32_t>(const uint32_t* source, uint32_t* des tination, unsigned pixelsPerRow) 1206 template<> void pack<WebGLImageConversion::DataFormatRGBA32, WebGLImageConversio n::AlphaDoPremultiply, uint32_t, uint32_t>(const uint32_t* source, uint32_t* des tination, unsigned pixelsPerRow)
1173 { 1207 {
1174 // FIXME: Implement this. 1208 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1175 ASSERT_NOT_REACHED(); 1209 double scaleFactor = static_cast<double>(source[3]) / maxUInt32Value;
1176 } 1210 destination[0] = static_cast<uint32_t>(static_cast<double>(source[0]) * scaleFactor);
1177 1211 destination[1] = static_cast<uint32_t>(static_cast<double>(source[1]) * scaleFactor);
1178 // FIXME: this routine is lossy and must be removed. 1212 destination[2] = static_cast<uint32_t>(static_cast<double>(source[2]) * scaleFactor);
1179 template<> void pack<WebGLImageConversion::DataFormatRGBA32, WebGLImageConversio n::AlphaDoUnmultiply, uint32_t, uint32_t>(const uint32_t* source, uint32_t* dest ination, unsigned pixelsPerRow) 1213 destination[3] = source[3];
1180 { 1214 source += 4;
1181 // FIXME: Implement this. 1215 destination += 4;
1182 ASSERT_NOT_REACHED(); 1216 }
1183 } 1217 }
1184 1218
1185 template<> void pack<WebGLImageConversion::DataFormatRGBA32_S, WebGLImageConvers ion::AlphaDoPremultiply, int32_t, int32_t>(const int32_t* source, int32_t* desti nation, unsigned pixelsPerRow) 1219 template<> void pack<WebGLImageConversion::DataFormatRGBA32_S, WebGLImageConvers ion::AlphaDoPremultiply, int32_t, int32_t>(const int32_t* source, int32_t* desti nation, unsigned pixelsPerRow)
1186 { 1220 {
1187 // FIXME: Implement this. 1221 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1188 ASSERT_NOT_REACHED(); 1222 destination[3] = ClampMin(source[3]);
1223 double scaleFactor = static_cast<double>(destination[3]) / maxInt32Value ;
1224 destination[0] = static_cast<int32_t>(static_cast<double>(ClampMin(sourc e[0])) * scaleFactor);
1225 destination[1] = static_cast<int32_t>(static_cast<double>(ClampMin(sourc e[1])) * scaleFactor);
1226 destination[2] = static_cast<int32_t>(static_cast<double>(ClampMin(sourc e[2])) * scaleFactor);
1227 source += 4;
1228 destination += 4;
1229 }
1189 } 1230 }
1190 1231
1191 // FIXME: this routine is lossy and must be removed. 1232 template<> void pack<WebGLImageConversion::DataFormatRGBA2_10_10_10, WebGLImageC onversion::AlphaDoPremultiply, float, uint32_t>(const float* source, uint32_t* d estination, unsigned pixelsPerRow)
1192 template<> void pack<WebGLImageConversion::DataFormatRGBA32_S, WebGLImageConvers ion::AlphaDoUnmultiply, int32_t, int32_t>(const int32_t* source, int32_t* destin ation, unsigned pixelsPerRow)
1193 { 1233 {
1194 // FIXME: Implement this. 1234 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1195 ASSERT_NOT_REACHED(); 1235 uint32_t r = static_cast<uint32_t>(source[0] * source[3] * 1023.0f);
1196 } 1236 uint32_t g = static_cast<uint32_t>(source[1] * source[3] * 1023.0f);
1197 1237 uint32_t b = static_cast<uint32_t>(source[2] * source[3] * 1023.0f);
1198 template<> void pack<WebGLImageConversion::DataFormatRGBA2_10_10_10, WebGLImageC onversion::AlphaDoPremultiply, uint16_t, uint32_t>(const uint16_t* source, uint3 2_t* destination, unsigned pixelsPerRow) 1238 uint32_t a = static_cast<uint32_t>(source[3] * 3.0f);
1199 { 1239 destination[0] = (a << 30) | (b << 20) | (g << 10) | r;
1200 // FIXME: Implement this. 1240 source += 4;
1201 ASSERT_NOT_REACHED(); 1241 destination += 1;
1202 } 1242 }
1203
1204 // FIXME: this routine is lossy and must be removed.
1205 template<> void pack<WebGLImageConversion::DataFormatRGBA2_10_10_10, WebGLImageC onversion::AlphaDoUnmultiply, uint16_t, uint32_t>(const uint16_t* source, uint32 _t* destination, unsigned pixelsPerRow)
1206 {
1207 // FIXME: Implement this.
1208 ASSERT_NOT_REACHED();
1209 }
1210
1211 template<> void pack<WebGLImageConversion::DataFormatRGB10F11F11F, WebGLImageCon version::AlphaDoNothing, float, uint32_t>(const float* source, uint32_t* destina tion, unsigned pixelsPerRow)
1212 {
1213 // FIXME: Implement this.
1214 ASSERT_NOT_REACHED();
1215 }
1216
1217 template<> void pack<WebGLImageConversion::DataFormatRGB10F11F11F, WebGLImageCon version::AlphaDoPremultiply, float, uint32_t>(const float* source, uint32_t* des tination, unsigned pixelsPerRow)
1218 {
1219 // FIXME: Implement this.
1220 ASSERT_NOT_REACHED();
1221 }
1222
1223 // FIXME: this routine is lossy and must be removed.
1224 template<> void pack<WebGLImageConversion::DataFormatRGB10F11F11F, WebGLImageCon version::AlphaDoUnmultiply, float, uint32_t>(const float* source, uint32_t* dest ination, unsigned pixelsPerRow)
1225 {
1226 // FIXME: Implement this.
1227 ASSERT_NOT_REACHED();
1228 } 1243 }
1229 1244
1230 template<> void pack<WebGLImageConversion::DataFormatRG8, WebGLImageConversion:: AlphaDoNothing, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, u nsigned pixelsPerRow) 1245 template<> void pack<WebGLImageConversion::DataFormatRG8, WebGLImageConversion:: AlphaDoNothing, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination, u nsigned pixelsPerRow)
1231 { 1246 {
1232 // FIXME: Implement this. 1247 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1233 ASSERT_NOT_REACHED(); 1248 destination[0] = source[0];
1249 destination[1] = source[1];
1250 source += 4;
1251 destination += 2;
1252 }
1234 } 1253 }
1235 1254
1236 template<> void pack<WebGLImageConversion::DataFormatRG8, WebGLImageConversion:: AlphaDoPremultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destinatio n, unsigned pixelsPerRow) 1255 template<> void pack<WebGLImageConversion::DataFormatRG8, WebGLImageConversion:: AlphaDoPremultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destinatio n, unsigned pixelsPerRow)
1237 { 1256 {
1238 // FIXME: Implement this. 1257 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1239 ASSERT_NOT_REACHED(); 1258 float scaleFactor = static_cast<float>(source[3]) / maxUInt8Value;
1259 destination[0] = static_cast<uint8_t>(static_cast<float>(source[0]) * sc aleFactor);
1260 destination[1] = static_cast<uint8_t>(static_cast<float>(source[1]) * sc aleFactor);
1261 source += 4;
1262 destination += 2;
1263 }
1240 } 1264 }
1241 1265
1242 // FIXME: this routine is lossy and must be removed. 1266 // FIXME: this routine is lossy and must be removed.
1243 template<> void pack<WebGLImageConversion::DataFormatRG8, WebGLImageConversion:: AlphaDoUnmultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination , unsigned pixelsPerRow) 1267 template<> void pack<WebGLImageConversion::DataFormatRG8, WebGLImageConversion:: AlphaDoUnmultiply, uint8_t, uint8_t>(const uint8_t* source, uint8_t* destination , unsigned pixelsPerRow)
1244 { 1268 {
1245 // FIXME: Implement this. 1269 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1246 ASSERT_NOT_REACHED(); 1270 float scaleFactor = source[3] ? maxUInt8Value / static_cast<float>(sourc e[3]) : 1.0f;
1271 destination[0] = static_cast<uint8_t>(static_cast<float>(source[0]) * sc aleFactor);
1272 destination[1] = static_cast<uint8_t>(static_cast<float>(source[1]) * sc aleFactor);
1273 source += 4;
1274 destination += 2;
1275 }
1247 } 1276 }
1248 1277
1249 template<> void pack<WebGLImageConversion::DataFormatRG16F, WebGLImageConversion ::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, u nsigned pixelsPerRow) 1278 template<> void pack<WebGLImageConversion::DataFormatRG16F, WebGLImageConversion ::AlphaDoNothing, float, uint16_t>(const float* source, uint16_t* destination, u nsigned pixelsPerRow)
1250 { 1279 {
1251 // FIXME: Implement this. 1280 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1252 ASSERT_NOT_REACHED(); 1281 destination[0] = convertFloatToHalfFloat(source[0]);
1282 destination[1] = convertFloatToHalfFloat(source[1]);
1283 source += 4;
1284 destination += 2;
1285 }
1286
1253 } 1287 }
1254 1288
1255 template<> void pack<WebGLImageConversion::DataFormatRG16F, WebGLImageConversion ::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destinatio n, unsigned pixelsPerRow) 1289 template<> void pack<WebGLImageConversion::DataFormatRG16F, WebGLImageConversion ::AlphaDoPremultiply, float, uint16_t>(const float* source, uint16_t* destinatio n, unsigned pixelsPerRow)
1256 { 1290 {
1257 // FIXME: Implement this. 1291 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1258 ASSERT_NOT_REACHED(); 1292 float scaleFactor = source[3];
1293 destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
1294 destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
1295 source += 4;
1296 destination += 2;
1297 }
1259 } 1298 }
1260 1299
1261 // FIXME: this routine is lossy and must be removed. 1300 // FIXME: this routine is lossy and must be removed.
1262 template<> void pack<WebGLImageConversion::DataFormatRG16F, WebGLImageConversion ::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination , unsigned pixelsPerRow) 1301 template<> void pack<WebGLImageConversion::DataFormatRG16F, WebGLImageConversion ::AlphaDoUnmultiply, float, uint16_t>(const float* source, uint16_t* destination , unsigned pixelsPerRow)
1263 { 1302 {
1264 // FIXME: Implement this. 1303 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1265 ASSERT_NOT_REACHED(); 1304 float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
1305 destination[0] = convertFloatToHalfFloat(source[0] * scaleFactor);
1306 destination[1] = convertFloatToHalfFloat(source[1] * scaleFactor);
1307 source += 4;
1308 destination += 2;
1309 }
1266 } 1310 }
1267 1311
1268 template<> void pack<WebGLImageConversion::DataFormatRG32F, WebGLImageConversion ::AlphaDoNothing, float, float>(const float* source, float* destination, unsigne d pixelsPerRow) 1312 template<> void pack<WebGLImageConversion::DataFormatRG32F, WebGLImageConversion ::AlphaDoNothing, float, float>(const float* source, float* destination, unsigne d pixelsPerRow)
1269 { 1313 {
1270 // FIXME: Implement this. 1314 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1271 ASSERT_NOT_REACHED(); 1315 destination[0] = source[0];
1316 destination[1] = source[1];
1317 source += 4;
1318 destination += 2;
1319 }
1272 } 1320 }
1273 1321
1274 template<> void pack<WebGLImageConversion::DataFormatRG32F, WebGLImageConversion ::AlphaDoPremultiply, float, float>(const float* source, float* destination, uns igned pixelsPerRow) 1322 template<> void pack<WebGLImageConversion::DataFormatRG32F, WebGLImageConversion ::AlphaDoPremultiply, float, float>(const float* source, float* destination, uns igned pixelsPerRow)
1275 { 1323 {
1276 // FIXME: Implement this. 1324 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1277 ASSERT_NOT_REACHED(); 1325 float scaleFactor = source[3];
1326 destination[0] = source[0] * scaleFactor;
1327 destination[1] = source[1] * scaleFactor;
1328 source += 4;
1329 destination += 2;
1330 }
1278 } 1331 }
1279 1332
1280 // FIXME: this routine is lossy and must be removed. 1333 // FIXME: this routine is lossy and must be removed.
1281 template<> void pack<WebGLImageConversion::DataFormatRG32F, WebGLImageConversion ::AlphaDoUnmultiply, float, float>(const float* source, float* destination, unsi gned pixelsPerRow) 1334 template<> void pack<WebGLImageConversion::DataFormatRG32F, WebGLImageConversion ::AlphaDoUnmultiply, float, float>(const float* source, float* destination, unsi gned pixelsPerRow)
1282 { 1335 {
1283 // FIXME: Implement this. 1336 for (unsigned i = 0; i < pixelsPerRow; ++i) {
1284 ASSERT_NOT_REACHED(); 1337 float scaleFactor = source[3] ? 1.0f / source[3] : 1.0f;
1338 destination[0] = source[0] * scaleFactor;
1339 destination[1] = source[1] * scaleFactor;
1340 source += 4;
1341 destination += 2;
1342 }
1285 } 1343 }
1286 1344
1287 bool HasAlpha(int format) 1345 bool HasAlpha(int format)
1288 { 1346 {
1289 return format == WebGLImageConversion::DataFormatA8 1347 return format == WebGLImageConversion::DataFormatA8
1290 || format == WebGLImageConversion::DataFormatA16F 1348 || format == WebGLImageConversion::DataFormatA16F
1291 || format == WebGLImageConversion::DataFormatA32F 1349 || format == WebGLImageConversion::DataFormatA32F
1292 || format == WebGLImageConversion::DataFormatRA8 1350 || format == WebGLImageConversion::DataFormatRA8
1293 || format == WebGLImageConversion::DataFormatAR8 1351 || format == WebGLImageConversion::DataFormatAR8
1294 || format == WebGLImageConversion::DataFormatRA16F 1352 || format == WebGLImageConversion::DataFormatRA16F
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1521 template<int Format> 1579 template<int Format>
1522 struct DataTypeForFormat<Format, false, false, false, false, false, false, false , false, false, true> { 1580 struct DataTypeForFormat<Format, false, false, false, false, false, false, false , false, false, true> {
1523 typedef uint32_t Type; 1581 typedef uint32_t Type;
1524 }; 1582 };
1525 1583
1526 template<int Format> 1584 template<int Format>
1527 struct UsesFloatIntermediateFormat { 1585 struct UsesFloatIntermediateFormat {
1528 static const bool Value = 1586 static const bool Value =
1529 IsFloatFormat<Format>::Value 1587 IsFloatFormat<Format>::Value
1530 || IsHalfFloatFormat<Format>::Value 1588 || IsHalfFloatFormat<Format>::Value
1589 || Format == WebGLImageConversion::DataFormatRGBA2_10_10_10
1531 || Format == WebGLImageConversion::DataFormatRGB10F11F11F 1590 || Format == WebGLImageConversion::DataFormatRGB10F11F11F
1532 || Format == WebGLImageConversion::DataFormatRGB5999; 1591 || Format == WebGLImageConversion::DataFormatRGB5999;
1533 }; 1592 };
1534 1593
1535 template<int Format> 1594 template<int Format>
1536 struct IntermediateFormat { 1595 struct IntermediateFormat {
1537 static const int Value = 1596 static const int Value =
1538 UsesFloatIntermediateFormat<Format>::Value ? WebGLImageConversion::DataF ormatRGBA32F 1597 UsesFloatIntermediateFormat<Format>::Value ? WebGLImageConversion::DataF ormatRGBA32F
1539 : IsInt32Format<Format>::Value ? WebGLImageConversion::DataFormatRGBA32_ S 1598 : IsInt32Format<Format>::Value ? WebGLImageConversion::DataFormatRGBA32_ S
1540 : IsUInt32Format<Format>::Value ? WebGLImageConversion::DataFormatRGBA32 1599 : IsUInt32Format<Format>::Value ? WebGLImageConversion::DataFormatRGBA32
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1572 case WebGLImageConversion::DataFormatARGB8: 1631 case WebGLImageConversion::DataFormatARGB8:
1573 case WebGLImageConversion::DataFormatABGR8: 1632 case WebGLImageConversion::DataFormatABGR8:
1574 case WebGLImageConversion::DataFormatBGRA8: 1633 case WebGLImageConversion::DataFormatBGRA8:
1575 case WebGLImageConversion::DataFormatR32: 1634 case WebGLImageConversion::DataFormatR32:
1576 case WebGLImageConversion::DataFormatR32_S: 1635 case WebGLImageConversion::DataFormatR32_S:
1577 case WebGLImageConversion::DataFormatR32F: 1636 case WebGLImageConversion::DataFormatR32F:
1578 case WebGLImageConversion::DataFormatA32F: 1637 case WebGLImageConversion::DataFormatA32F:
1579 case WebGLImageConversion::DataFormatRA16F: 1638 case WebGLImageConversion::DataFormatRA16F:
1580 case WebGLImageConversion::DataFormatRGBA2_10_10_10: 1639 case WebGLImageConversion::DataFormatRGBA2_10_10_10:
1581 case WebGLImageConversion::DataFormatRGB10F11F11F: 1640 case WebGLImageConversion::DataFormatRGB10F11F11F:
1641 case WebGLImageConversion::DataFormatRGB5999:
1582 case WebGLImageConversion::DataFormatRG16: 1642 case WebGLImageConversion::DataFormatRG16:
1583 case WebGLImageConversion::DataFormatRG16_S: 1643 case WebGLImageConversion::DataFormatRG16_S:
1584 case WebGLImageConversion::DataFormatRG16F: 1644 case WebGLImageConversion::DataFormatRG16F:
1585 case WebGLImageConversion::DataFormatD32: 1645 case WebGLImageConversion::DataFormatD32:
1586 case WebGLImageConversion::DataFormatD32F: 1646 case WebGLImageConversion::DataFormatD32F:
1587 case WebGLImageConversion::DataFormatDS24_8: 1647 case WebGLImageConversion::DataFormatDS24_8:
1588 return 4; 1648 return 4;
1589 case WebGLImageConversion::DataFormatRGB16: 1649 case WebGLImageConversion::DataFormatRGB16:
1590 case WebGLImageConversion::DataFormatRGB16_S: 1650 case WebGLImageConversion::DataFormatRGB16_S:
1591 case WebGLImageConversion::DataFormatRGB16F: 1651 case WebGLImageConversion::DataFormatRGB16F:
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1695 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA5 551) 1755 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA5 551)
1696 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA4 444) 1756 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA4 444)
1697 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA1 6F) 1757 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA1 6F)
1698 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA3 2F) 1758 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA3 2F)
1699 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA8 _S) 1759 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA8 _S)
1700 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA1 6) 1760 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA1 6)
1701 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA1 6_S) 1761 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA1 6_S)
1702 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA3 2) 1762 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA3 2)
1703 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA3 2_S) 1763 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA3 2_S)
1704 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA2 _10_10_10) 1764 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGBA2 _10_10_10)
1705 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRGB10 F11F11F)
1706 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG8) 1765 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG8)
1707 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG16F ) 1766 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG16F )
1708 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG32F ) 1767 FORMATCONVERTER_CASE_DSTFORMAT(WebGLImageConversion::DataFormatRG32F )
1709 default: 1768 default:
1710 ASSERT_NOT_REACHED(); 1769 ASSERT_NOT_REACHED();
1711 } 1770 }
1712 1771
1713 #undef FORMATCONVERTER_CASE_DSTFORMAT 1772 #undef FORMATCONVERTER_CASE_DSTFORMAT
1714 } 1773 }
1715 1774
1716 template<WebGLImageConversion::DataFormat SrcFormat, WebGLImageConversion::DataF ormat DstFormat> 1775 template<WebGLImageConversion::DataFormat SrcFormat, WebGLImageConversion::DataF ormat DstFormat>
1717 void FormatConverter::convert(WebGLImageConversion::AlphaOp alphaOp) 1776 void FormatConverter::convert(WebGLImageConversion::AlphaOp alphaOp)
1718 { 1777 {
1719 #define FORMATCONVERTER_CASE_ALPHAOP(alphaOp) \ 1778 #define FORMATCONVERTER_CASE_ALPHAOP(alphaOp) \
1720 case alphaOp: \ 1779 case alphaOp: \
1721 return convert<SrcFormat, DstFormat, alphaOp>(); 1780 return convert<SrcFormat, DstFormat, alphaOp>();
1722 1781
1723 switch (alphaOp) { 1782 switch (alphaOp) {
1724 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoNothing) 1783 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoNothing)
1725 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoPremultipl y) 1784 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoPremultipl y)
1726 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoUnmultiply ) 1785 FORMATCONVERTER_CASE_ALPHAOP(WebGLImageConversion::AlphaDoUnmultiply )
1727 default: 1786 default:
1728 ASSERT_NOT_REACHED(); 1787 ASSERT_NOT_REACHED();
1729 } 1788 }
1730 #undef FORMATCONVERTER_CASE_ALPHAOP 1789 #undef FORMATCONVERTER_CASE_ALPHAOP
1731 } 1790 }
1732 1791
1792 template<int Format>
1793 struct SupportsConversionFromDomElements {
1794 static const bool Value =
1795 Format == WebGLImageConversion::DataFormatRGBA8
1796 || Format == WebGLImageConversion::DataFormatRGB8
1797 || Format == WebGLImageConversion::DataFormatRG8
1798 || Format == WebGLImageConversion::DataFormatRA8
1799 || Format == WebGLImageConversion::DataFormatR8
1800 || Format == WebGLImageConversion::DataFormatRGBA32F
1801 || Format == WebGLImageConversion::DataFormatRGB32F
1802 || Format == WebGLImageConversion::DataFormatRG32F
1803 || Format == WebGLImageConversion::DataFormatRA32F
1804 || Format == WebGLImageConversion::DataFormatR32F
1805 || Format == WebGLImageConversion::DataFormatRGBA16F
1806 || Format == WebGLImageConversion::DataFormatRGB16F
1807 || Format == WebGLImageConversion::DataFormatRG16F
1808 || Format == WebGLImageConversion::DataFormatRA16F
1809 || Format == WebGLImageConversion::DataFormatR16F
1810 || Format == WebGLImageConversion::DataFormatRGBA5551
1811 || Format == WebGLImageConversion::DataFormatRGBA4444
1812 || Format == WebGLImageConversion::DataFormatRGB565;
1813 };
1814
1733 template<WebGLImageConversion::DataFormat SrcFormat, WebGLImageConversion::DataF ormat DstFormat, WebGLImageConversion::AlphaOp alphaOp> 1815 template<WebGLImageConversion::DataFormat SrcFormat, WebGLImageConversion::DataF ormat DstFormat, WebGLImageConversion::AlphaOp alphaOp>
1734 void FormatConverter::convert() 1816 void FormatConverter::convert()
1735 { 1817 {
1736 // Many instantiations of this template function will never be entered, so w e try 1818 // Many instantiations of this template function will never be entered, so w e try
1737 // to return immediately in these cases to avoid the compiler to generate us eless code. 1819 // to return immediately in these cases to avoid the compiler to generate us eless code.
1738 if (SrcFormat == DstFormat && alphaOp == WebGLImageConversion::AlphaDoNothin g) { 1820 if (SrcFormat == DstFormat && alphaOp == WebGLImageConversion::AlphaDoNothin g) {
1739 ASSERT_NOT_REACHED(); 1821 ASSERT_NOT_REACHED();
1740 return; 1822 return;
1741 } 1823 }
1742 if (!IsFloatFormat<DstFormat>::Value && IsFloatFormat<SrcFormat>::Value) { 1824 if (!IsFloatFormat<DstFormat>::Value && IsFloatFormat<SrcFormat>::Value) {
1743 ASSERT_NOT_REACHED(); 1825 ASSERT_NOT_REACHED();
1744 return; 1826 return;
1745 } 1827 }
1746 1828
1747 // Only textures uploaded from DOM elements or ImageData can allow DstFormat != SrcFormat. 1829 // Only textures uploaded from DOM elements or ImageData can allow DstFormat != SrcFormat.
1748 const bool srcFormatComesFromDOMElementOrImageData = WebGLImageConversion::s rcFormatComeFromDOMElementOrImageData(SrcFormat); 1830 const bool srcFormatComesFromDOMElementOrImageData = WebGLImageConversion::s rcFormatComeFromDOMElementOrImageData(SrcFormat);
1749 if (!srcFormatComesFromDOMElementOrImageData && SrcFormat != DstFormat) { 1831 if (!srcFormatComesFromDOMElementOrImageData && SrcFormat != DstFormat) {
1750 ASSERT_NOT_REACHED(); 1832 ASSERT_NOT_REACHED();
1751 return; 1833 return;
1752 } 1834 }
1753 // Likewise, only textures uploaded from DOM elements or ImageData can possi bly have to be unpremultiplied. 1835 // Likewise, only textures uploaded from DOM elements or ImageData can possi bly have to be unpremultiplied.
1754 if (!srcFormatComesFromDOMElementOrImageData && alphaOp == WebGLImageConvers ion::AlphaDoUnmultiply) { 1836 if (!srcFormatComesFromDOMElementOrImageData && alphaOp == WebGLImageConvers ion::AlphaDoUnmultiply) {
1755 ASSERT_NOT_REACHED(); 1837 ASSERT_NOT_REACHED();
1756 return; 1838 return;
1757 } 1839 }
1840 if (srcFormatComesFromDOMElementOrImageData && alphaOp == WebGLImageConversi on::AlphaDoUnmultiply && !SupportsConversionFromDomElements<DstFormat>::Value) {
1841 ASSERT_NOT_REACHED();
1842 return;
1843 }
1758 if ((!HasAlpha(SrcFormat) || !HasColor(SrcFormat) || !HasColor(DstFormat)) & & alphaOp != WebGLImageConversion::AlphaDoNothing) { 1844 if ((!HasAlpha(SrcFormat) || !HasColor(SrcFormat) || !HasColor(DstFormat)) & & alphaOp != WebGLImageConversion::AlphaDoNothing) {
1759 ASSERT_NOT_REACHED(); 1845 ASSERT_NOT_REACHED();
1760 return; 1846 return;
1761 } 1847 }
1848 // If converting DOM element data to UNSIGNED_INT_5_9_9_9_REV or UNSIGNED_IN T_10F_11F_11F_REV,
1849 // we should always switch to FLOAT instead to avoid unpack/pack to these tw o types.
1850 if (srcFormatComesFromDOMElementOrImageData && SrcFormat != DstFormat
1851 && (DstFormat == WebGLImageConversion::DataFormatRGB5999 || DstFormat == WebGLImageConversion::DataFormatRGB10F11F11F)) {
1852 ASSERT_NOT_REACHED();
1853 return;
1854 }
1762 1855
1763 typedef typename DataTypeForFormat<SrcFormat>::Type SrcType; 1856 typedef typename DataTypeForFormat<SrcFormat>::Type SrcType;
1764 typedef typename DataTypeForFormat<DstFormat>::Type DstType; 1857 typedef typename DataTypeForFormat<DstFormat>::Type DstType;
1765 const int IntermFormat = IntermediateFormat<DstFormat>::Value; 1858 const int IntermFormat = IntermediateFormat<DstFormat>::Value;
1766 typedef typename DataTypeForFormat<IntermFormat>::Type IntermType; 1859 typedef typename DataTypeForFormat<IntermFormat>::Type IntermType;
1767 const ptrdiff_t srcStrideInElements = m_srcStride / sizeof(SrcType); 1860 const ptrdiff_t srcStrideInElements = m_srcStride / sizeof(SrcType);
1768 const ptrdiff_t dstStrideInElements = m_dstStride / sizeof(DstType); 1861 const ptrdiff_t dstStrideInElements = m_dstStride / sizeof(DstType);
1769 const bool trivialUnpack = SrcFormat == IntermFormat; 1862 const bool trivialUnpack = SrcFormat == IntermFormat;
1770 const bool trivialPack = DstFormat == IntermFormat && alphaOp == WebGLImageC onversion::AlphaDoNothing; 1863 const bool trivialPack = DstFormat == IntermFormat && alphaOp == WebGLImageC onversion::AlphaDoNothing;
1771 ASSERT(!trivialUnpack || !trivialPack); 1864 ASSERT(!trivialUnpack || !trivialPack);
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after
2189 } 2282 }
2190 2283
2191 FormatConverter converter(width, height, sourceData, destinationData, srcStr ide, dstStride); 2284 FormatConverter converter(width, height, sourceData, destinationData, srcStr ide, dstStride);
2192 converter.convert(sourceDataFormat, dstDataFormat, alphaOp); 2285 converter.convert(sourceDataFormat, dstDataFormat, alphaOp);
2193 if (!converter.Success()) 2286 if (!converter.Success())
2194 return false; 2287 return false;
2195 return true; 2288 return true;
2196 } 2289 }
2197 2290
2198 } // namespace blink 2291 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698