//----------------------------------------------------------------------------- void GLESTextureBuffer::blit(const HardwarePixelBufferSharedPtr &src, const Image::Box &srcBox, const Image::Box &dstBox) { GLESTextureBuffer *srct = static_cast<GLESTextureBuffer *>(src.getPointer()); // TODO: Check for FBO support first // Destination texture must be 2D // Source texture must be 2D if((src->getUsage() & TU_RENDERTARGET) == 0 && (srct->mTarget == GL_TEXTURE_2D)) { blitFromTexture(srct, srcBox, dstBox); } else { GLESHardwarePixelBuffer::blit(src, srcBox, dstBox); } }
void HardwarePixelBuffer::blit(const HardwarePixelBufferSharedPtr &src, const Image::Box &srcBox, const Image::Box &dstBox) { if(isLocked() || src->isLocked()) { OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Source and destination buffer may not be locked!", "HardwarePixelBuffer::blit"); } if(src.getPointer() == this) { OGRE_EXCEPT( Exception::ERR_INVALIDPARAMS, "Source must not be the same object", "HardwarePixelBuffer::blit" ) ; } const PixelBox &srclock = src->lock(srcBox, HBL_READ_ONLY); LockOptions method = HBL_NORMAL; if(dstBox.left == 0 && dstBox.top == 0 && dstBox.front == 0 && dstBox.right == mWidth && dstBox.bottom == mHeight && dstBox.back == mDepth) // Entire buffer -- we can discard the previous contents method = HBL_DISCARD; const PixelBox &dstlock = lock(dstBox, method); if(dstlock.getWidth() != srclock.getWidth() || dstlock.getHeight() != srclock.getHeight() || dstlock.getDepth() != srclock.getDepth()) { // Scaling desired Image::scale(srclock, dstlock); } else { // No scaling needed PixelUtil::bulkPixelConversion(srclock, dstlock); } unlock(); src->unlock(); }