| 242 | } |
| 243 | |
| 244 | void Image::Blit(Offset3D dstRegionOffset, const Image& srcImage, Offset3D srcRegionOffset, Extent3D srcRegionExtent) |
| 245 | { |
| 246 | if (GetFormat() == srcImage.GetFormat() && GetDataType() == srcImage.GetDataType()) |
| 247 | { |
| 248 | /* First clamp source region to source image dimension */ |
| 249 | srcImage.ClampRegion(srcRegionOffset, srcRegionExtent); |
| 250 | |
| 251 | /* Then shift negative destination region */ |
| 252 | if ( ShiftNegative1DRegion(dstRegionOffset.x, GetExtent().width, srcRegionOffset.x, srcRegionExtent.width ) && |
| 253 | ShiftNegative1DRegion(dstRegionOffset.y, GetExtent().height, srcRegionOffset.y, srcRegionExtent.height) && |
| 254 | ShiftNegative1DRegion(dstRegionOffset.z, GetExtent().depth, srcRegionOffset.z, srcRegionExtent.depth ) ) |
| 255 | { |
| 256 | /* Check if a temporary copy of the source image must be allocated */ |
| 257 | Image srcImageTemp; |
| 258 | const Image* srcImageRef = &srcImage; |
| 259 | |
| 260 | if (srcImageRef == this && Overlap3DRegion(dstRegionOffset, srcRegionOffset, srcRegionExtent)) |
| 261 | { |
| 262 | /* Copy source image */ |
| 263 | srcImageTemp = *this; |
| 264 | srcImageRef = &srcImageTemp; |
| 265 | } |
| 266 | |
| 267 | /* Copy image buffer region */ |
| 268 | const auto srcExtent = srcImageRef->GetExtent(); |
| 269 | const auto dstExtent = GetExtent(); |
| 270 | |
| 271 | CopyImageBufferRegion( |
| 272 | GetDstDesc(), |
| 273 | dstRegionOffset, |
| 274 | dstExtent.width, |
| 275 | dstExtent.width * dstExtent.height, |
| 276 | srcImageRef->GetSrcDesc(), |
| 277 | srcRegionOffset, |
| 278 | srcExtent.width, |
| 279 | srcExtent.width * srcExtent.height, |
| 280 | srcRegionExtent |
| 281 | ); |
| 282 | } |
| 283 | } |
| 284 | } |
| 285 | |
| 286 | void Image::Fill(Offset3D offset, Extent3D extent, const ColorRGBAd& fillColor) |
| 287 | { |