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