|
202 | 202 | std::vector<unsigned char> rearrangedDataC; |
203 | 203 | void* imageData = image->getResourceBuffer(); |
204 | 204 |
|
205 | | - if ((pixelFormat == MTLPixelFormatRGBA32Float || pixelFormat == MTLPixelFormatRGBA8Unorm) && channelCount == 3) |
| 205 | + id<MTLBuffer> buffer = nil; |
| 206 | + if (imageData) |
206 | 207 | { |
207 | | - bool isFloat = pixelFormat == MTLPixelFormatRGBA32Float; |
| 208 | + if ((pixelFormat == MTLPixelFormatRGBA32Float || pixelFormat == MTLPixelFormatRGBA8Unorm) && channelCount == 3) |
| 209 | + { |
| 210 | + bool isFloat = pixelFormat == MTLPixelFormatRGBA32Float; |
208 | 211 |
|
209 | | - sourceBytesPerRow = sourceBytesPerRow / 3 * 4; |
210 | | - sourceBytesPerImage = sourceBytesPerImage / 3 * 4; |
| 212 | + sourceBytesPerRow = sourceBytesPerRow / 3 * 4; |
| 213 | + sourceBytesPerImage = sourceBytesPerImage / 3 * 4; |
211 | 214 |
|
212 | | - size_t srcIdx = 0; |
| 215 | + size_t srcIdx = 0; |
213 | 216 |
|
214 | | - if (isFloat) |
215 | | - { |
216 | | - rearrangedDataF.resize(sourceBytesPerImage / sizeof(float)); |
217 | | - for (size_t dstIdx = 0; dstIdx < rearrangedDataF.size(); ++dstIdx) |
| 217 | + if (isFloat) |
218 | 218 | { |
219 | | - if ((dstIdx & 0x3) == 3) |
| 219 | + rearrangedDataF.resize(sourceBytesPerImage / sizeof(float)); |
| 220 | + for (size_t dstIdx = 0; dstIdx < rearrangedDataF.size(); ++dstIdx) |
220 | 221 | { |
221 | | - rearrangedDataF[dstIdx] = 1.0f; |
222 | | - continue; |
| 222 | + if ((dstIdx & 0x3) == 3) |
| 223 | + { |
| 224 | + rearrangedDataF[dstIdx] = 1.0f; |
| 225 | + continue; |
| 226 | + } |
| 227 | + |
| 228 | + rearrangedDataF[dstIdx] = ((float*) imageData)[srcIdx++]; |
223 | 229 | } |
224 | 230 |
|
225 | | - rearrangedDataF[dstIdx] = ((float*) imageData)[srcIdx++]; |
| 231 | + imageData = rearrangedDataF.data(); |
226 | 232 | } |
227 | | - |
228 | | - imageData = rearrangedDataF.data(); |
229 | | - } |
230 | | - else |
231 | | - { |
232 | | - rearrangedDataC.resize(sourceBytesPerImage); |
233 | | - for (size_t dstIdx = 0; dstIdx < rearrangedDataC.size(); ++dstIdx) |
| 233 | + else |
234 | 234 | { |
235 | | - if ((dstIdx & 0x3) == 3) |
| 235 | + rearrangedDataC.resize(sourceBytesPerImage); |
| 236 | + for (size_t dstIdx = 0; dstIdx < rearrangedDataC.size(); ++dstIdx) |
236 | 237 | { |
237 | | - rearrangedDataC[dstIdx] = 255; |
238 | | - continue; |
| 238 | + if ((dstIdx & 0x3) == 3) |
| 239 | + { |
| 240 | + rearrangedDataC[dstIdx] = 255; |
| 241 | + continue; |
| 242 | + } |
| 243 | + |
| 244 | + rearrangedDataC[dstIdx] = ((unsigned char*) imageData)[srcIdx++]; |
239 | 245 | } |
240 | 246 |
|
241 | | - rearrangedDataC[dstIdx] = ((unsigned char*) imageData)[srcIdx++]; |
| 247 | + imageData = rearrangedDataC.data(); |
242 | 248 | } |
243 | 249 |
|
244 | | - imageData = rearrangedDataC.data(); |
| 250 | + channelCount = 4; |
245 | 251 | } |
246 | 252 |
|
247 | | - channelCount = 4; |
248 | | - } |
249 | | - |
250 | | - id<MTLBuffer> buffer = nil; |
251 | | - if (imageData) |
252 | | - { |
253 | 253 | buffer = [_device newBufferWithBytes:imageData |
254 | 254 | length:sourceBytesPerImage |
255 | 255 | options:MTLStorageModeShared]; |
|
0 commit comments