| 570 | /* ----- Public functions ----- */ |
| 571 | |
| 572 | LLGL_EXPORT bool ConvertImageBuffer( |
| 573 | const SrcImageDescriptor& srcImageDesc, |
| 574 | const DstImageDescriptor& dstImageDesc, |
| 575 | std::size_t threadCount) |
| 576 | { |
| 577 | /* Validate input parameters */ |
| 578 | ValidateSourceImageDesc(srcImageDesc); |
| 579 | ValidateDestinationImageDesc(dstImageDesc); |
| 580 | ValidateImageConversionParams(srcImageDesc, dstImageDesc.format, dstImageDesc.dataType); |
| 581 | |
| 582 | if (threadCount >= Constants::maxThreadCount) |
| 583 | threadCount = std::thread::hardware_concurrency(); |
| 584 | |
| 585 | if (srcImageDesc.dataType != dstImageDesc.dataType && srcImageDesc.format != dstImageDesc.format) |
| 586 | { |
| 587 | /* Convert image data type with intermediate buffer */ |
| 588 | auto intermediateBufferSize = srcImageDesc.dataSize / DataTypeSize(srcImageDesc.dataType) * DataTypeSize(dstImageDesc.dataType); |
| 589 | auto intermediateBuffer = MakeUniqueArray<char>(intermediateBufferSize); |
| 590 | |
| 591 | ConvertImageBufferDataType( |
| 592 | srcImageDesc.dataType, |
| 593 | srcImageDesc.data, |
| 594 | srcImageDesc.dataSize, |
| 595 | dstImageDesc.dataType, |
| 596 | intermediateBuffer.get(), |
| 597 | intermediateBufferSize, |
| 598 | threadCount |
| 599 | ); |
| 600 | |
| 601 | /* Set new source buffer and source data type */ |
| 602 | const SrcImageDescriptor intermediateImageDesc |
| 603 | { |
| 604 | srcImageDesc.format, |
| 605 | dstImageDesc.dataType, |
| 606 | intermediateBuffer.get(), |
| 607 | intermediateBufferSize |
| 608 | }; |
| 609 | |
| 610 | /* Convert image format */ |
| 611 | ConvertImageBufferFormat(intermediateImageDesc, dstImageDesc, threadCount); |
| 612 | |
| 613 | return true; |
| 614 | } |
| 615 | else if (srcImageDesc.dataType != dstImageDesc.dataType) |
| 616 | { |
| 617 | /* Convert image data type */ |
| 618 | ConvertImageBufferDataType( |
| 619 | srcImageDesc.dataType, |
| 620 | srcImageDesc.data, |
| 621 | srcImageDesc.dataSize, |
| 622 | dstImageDesc.dataType, |
| 623 | dstImageDesc.data, |
| 624 | dstImageDesc.dataSize, |
| 625 | threadCount |
| 626 | ); |
| 627 | return true; |
| 628 | } |
| 629 | else if (srcImageDesc.format != dstImageDesc.format) |
no test coverage detected