| 16 | |
| 17 | |
| 18 | void BitBlit( |
| 19 | const Extent3D& extent, |
| 20 | std::uint32_t bpp, |
| 21 | char* dst, |
| 22 | std::uint32_t dstRowStride, |
| 23 | std::uint32_t dstDepthStride, |
| 24 | const char* src, |
| 25 | std::uint32_t srcRowStride, |
| 26 | std::uint32_t srcDepthStride) |
| 27 | { |
| 28 | const auto rowStride = bpp * extent.width; |
| 29 | const auto depthStride = rowStride * extent.height; |
| 30 | |
| 31 | if (srcRowStride == dstRowStride && rowStride == dstRowStride) |
| 32 | { |
| 33 | if (srcDepthStride == dstDepthStride && depthStride == dstDepthStride) |
| 34 | { |
| 35 | /* Copy region directly into output data */ |
| 36 | ::memcpy(dst, src, depthStride * extent.depth); |
| 37 | } |
| 38 | else |
| 39 | { |
| 40 | /* Copy region directly into output data */ |
| 41 | for (std::uint32_t z = 0; z < extent.depth; ++z) |
| 42 | { |
| 43 | /* Copy current slice */ |
| 44 | ::memcpy(dst, src, depthStride); |
| 45 | |
| 46 | /* Move pointers to next slice */ |
| 47 | dst += dstDepthStride; |
| 48 | src += srcDepthStride; |
| 49 | } |
| 50 | } |
| 51 | } |
| 52 | else |
| 53 | { |
| 54 | /* Adjust depth stride */ |
| 55 | srcDepthStride -= srcRowStride * extent.height; |
| 56 | |
| 57 | /* Copy region directly into output data */ |
| 58 | for (std::uint32_t z = 0; z < extent.depth; ++z) |
| 59 | { |
| 60 | /* Copy current slice */ |
| 61 | for (std::uint32_t y = 0; y < extent.height; ++y) |
| 62 | { |
| 63 | /* Copy current row */ |
| 64 | ::memcpy(dst, src, rowStride); |
| 65 | |
| 66 | /* Move pointers to next row */ |
| 67 | dst += dstRowStride; |
| 68 | src += srcRowStride; |
| 69 | } |
| 70 | |
| 71 | /* Move pointers to next slice */ |
| 72 | src += srcDepthStride; |
| 73 | } |
| 74 | } |
| 75 | } |
no test coverage detected