OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2010 Apple Inc. All rights reserved. |
3 * Copyright (C) 2010 Google Inc. All rights reserved. | 3 * Copyright (C) 2010 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 } | 233 } |
234 SourceDataFormat srcDataFormat = getSourceDataFormat(componentsPerPixel, alp
haFormat, bitsPerComponent == 16, bigEndianSource); | 234 SourceDataFormat srcDataFormat = getSourceDataFormat(componentsPerPixel, alp
haFormat, bitsPerComponent == 16, bigEndianSource); |
235 if (srcDataFormat == SourceFormatNumFormats) | 235 if (srcDataFormat == SourceFormatNumFormats) |
236 return false; | 236 return false; |
237 | 237 |
238 RetainPtr<CFDataRef> pixelData; | 238 RetainPtr<CFDataRef> pixelData; |
239 pixelData.adoptCF(CGDataProviderCopyData(CGImageGetDataProvider(cgImage))); | 239 pixelData.adoptCF(CGDataProviderCopyData(CGImageGetDataProvider(cgImage))); |
240 if (!pixelData) | 240 if (!pixelData) |
241 return false; | 241 return false; |
242 const UInt8* rgba = CFDataGetBytePtr(pixelData.get()); | 242 const UInt8* rgba = CFDataGetBytePtr(pixelData.get()); |
243 outputVector.resize(width * height * 4); | 243 |
| 244 unsigned int packedSize; |
| 245 // Output data is tightly packed (alignment == 1). |
| 246 if (computeImageSizeInBytes(format, type, width, height, 1, &packedSize, 0)
!= GraphicsContext3D::NO_ERROR) |
| 247 return false; |
| 248 outputVector.resize(packedSize); |
| 249 |
244 unsigned int srcUnpackAlignment = 0; | 250 unsigned int srcUnpackAlignment = 0; |
245 size_t bytesPerRow = CGImageGetBytesPerRow(cgImage); | 251 size_t bytesPerRow = CGImageGetBytesPerRow(cgImage); |
246 unsigned int padding = bytesPerRow - bitsPerPixel / 8 * width; | 252 unsigned int padding = bytesPerRow - bitsPerPixel / 8 * width; |
247 if (padding) { | 253 if (padding) { |
248 srcUnpackAlignment = padding + 1; | 254 srcUnpackAlignment = padding + 1; |
249 while (bytesPerRow % srcUnpackAlignment) | 255 while (bytesPerRow % srcUnpackAlignment) |
250 ++srcUnpackAlignment; | 256 ++srcUnpackAlignment; |
251 } | 257 } |
252 bool rt = packPixels(rgba, srcDataFormat, width, height, srcUnpackAlignment, | 258 bool rt = packPixels(rgba, srcDataFormat, width, height, srcUnpackAlignment, |
253 format, type, neededAlphaOp, outputVector.data()); | 259 format, type, neededAlphaOp, outputVector.data()); |
(...skipping 17 matching lines...) Expand all Loading... |
271 CGContextSaveGState(context); | 277 CGContextSaveGState(context); |
272 CGContextSetBlendMode(context, kCGBlendModeCopy); | 278 CGContextSetBlendMode(context, kCGBlendModeCopy); |
273 CGContextSetInterpolationQuality(context, kCGInterpolationNone); | 279 CGContextSetInterpolationQuality(context, kCGInterpolationNone); |
274 CGContextDrawImage(context, rect, cgImage.get()); | 280 CGContextDrawImage(context, rect, cgImage.get()); |
275 CGContextRestoreGState(context); | 281 CGContextRestoreGState(context); |
276 } | 282 } |
277 | 283 |
278 } // namespace WebCore | 284 } // namespace WebCore |
279 | 285 |
280 #endif // ENABLE(WEBGL) | 286 #endif // ENABLE(WEBGL) |
OLD | NEW |