| 756 | } |
| 757 | |
| 758 | LLGL_EXPORT void CopyImageBufferRegion( |
| 759 | const DstImageDescriptor& dstImageDesc, |
| 760 | const Offset3D& dstOffset, |
| 761 | std::uint32_t dstRowStride, |
| 762 | std::uint32_t dstSliceStride, |
| 763 | const SrcImageDescriptor& srcImageDesc, |
| 764 | const Offset3D& srcOffset, |
| 765 | std::uint32_t srcRowStride, |
| 766 | std::uint32_t srcSliceStride, |
| 767 | const Extent3D& extent) |
| 768 | { |
| 769 | /* Validate input parameters */ |
| 770 | ValidateSourceImageDesc(srcImageDesc); |
| 771 | ValidateDestinationImageDesc(dstImageDesc); |
| 772 | |
| 773 | if (srcImageDesc.format != dstImageDesc.format || srcImageDesc.dataType != dstImageDesc.dataType) |
| 774 | throw std::invalid_argument("cannot copy image buffer region with source and destination images having different format or data type"); |
| 775 | |
| 776 | const auto bpp = GetMemoryFootprint(dstImageDesc.format, dstImageDesc.dataType, 1); |
| 777 | |
| 778 | /* Validate destination image boundaries */ |
| 779 | const auto dstPos = GetFlattenedImageBufferPos(dstOffset.x, dstOffset.y, dstOffset.z, dstRowStride, dstSliceStride, bpp); |
| 780 | const auto dstPosEnd = GetFlattenedImageBufferPosEnd(dstOffset, extent, dstRowStride, dstSliceStride, bpp); |
| 781 | |
| 782 | if (dstPosEnd > dstImageDesc.dataSize) |
| 783 | throw std::out_of_range("destination image buffer region out of range"); |
| 784 | |
| 785 | /* Validate source image boundaries */ |
| 786 | const auto srcPos = GetFlattenedImageBufferPos(srcOffset.x, srcOffset.y, srcOffset.z, srcRowStride, srcSliceStride, bpp); |
| 787 | const auto srcPosEnd = GetFlattenedImageBufferPosEnd(srcOffset, extent, srcRowStride, srcSliceStride, bpp); |
| 788 | |
| 789 | if (srcPosEnd > srcImageDesc.dataSize) |
| 790 | throw std::out_of_range("source image buffer region out of range"); |
| 791 | |
| 792 | /* Copy image buffer region */ |
| 793 | BitBlit( |
| 794 | extent, |
| 795 | bpp, |
| 796 | (reinterpret_cast<char*>(dstImageDesc.data) + dstPos), |
| 797 | dstRowStride * bpp, |
| 798 | dstSliceStride * bpp, |
| 799 | (reinterpret_cast<const char*>(srcImageDesc.data) + srcPos), |
| 800 | srcRowStride * bpp, |
| 801 | srcSliceStride * bpp |
| 802 | ); |
| 803 | } |
| 804 | |
| 805 | LLGL_EXPORT ByteBuffer GenerateImageBuffer( |
| 806 | ImageFormat format, |
no test coverage detected