void LayerTextureSubImage::uploadWithMapTexSubImage(const uint8_t* image, const IntRect& imageRect, const IntRect& sourceRect, const IntRect& destRect, GC3Denum format, GraphicsContext3D* context) { TRACE_EVENT("LayerTextureSubImage::uploadWithMapTexSubImage", this, 0); // Offset from image-rect to source-rect. IntPoint offset(sourceRect.x() - imageRect.x(), sourceRect.y() - imageRect.y()); // Upload tile data via a mapped transfer buffer Extensions3DChromium* extensions = static_cast<Extensions3DChromium*>(context->getExtensions()); uint8_t* pixelDest = static_cast<uint8_t*>(extensions->mapTexSubImage2DCHROMIUM(GraphicsContext3D::TEXTURE_2D, 0, destRect.x(), destRect.y(), destRect.width(), destRect.height(), format, GraphicsContext3D::UNSIGNED_BYTE, Extensions3DChromium::WRITE_ONLY)); if (!pixelDest) { uploadWithTexSubImage(image, imageRect, sourceRect, destRect, format, context); return; } if (imageRect.width() == sourceRect.width() && !offset.x()) memcpy(pixelDest, &image[4 * offset.y() * imageRect.width()], imageRect.width() * destRect.height() * 4); else { // Strides not equal, so do a row-by-row memcpy from the // paint results into the pixelDest for (int row = 0; row < destRect.height(); ++row) memcpy(&pixelDest[destRect.width() * 4 * row], &image[4 * (offset.x() + (offset.y() + row) * imageRect.width())], destRect.width() * 4); } extensions->unmapTexSubImage2DCHROMIUM(pixelDest); }
void LayerTextureSubImage::uploadWithMapTexSubImage(const uint8_t* image, const IntRect& imageRect, const IntRect& sourceRect, const IntSize& destOffset, GC3Denum format, WebGraphicsContext3D* context) { TRACE_EVENT0("cc", "LayerTextureSubImage::uploadWithMapTexSubImage"); // Offset from image-rect to source-rect. IntPoint offset(sourceRect.x() - imageRect.x(), sourceRect.y() - imageRect.y()); // Upload tile data via a mapped transfer buffer uint8_t* pixelDest = static_cast<uint8_t*>(context->mapTexSubImage2DCHROMIUM(GraphicsContext3D::TEXTURE_2D, 0, destOffset.width(), destOffset.height(), sourceRect.width(), sourceRect.height(), format, GraphicsContext3D::UNSIGNED_BYTE, Extensions3DChromium::WRITE_ONLY)); if (!pixelDest) { uploadWithTexSubImage(image, imageRect, sourceRect, destOffset, format, context); return; } unsigned int componentsPerPixel; unsigned int bytesPerComponent; if (!GraphicsContext3D::computeFormatAndTypeParameters(format, GraphicsContext3D::UNSIGNED_BYTE, &componentsPerPixel, &bytesPerComponent)) { ASSERT_NOT_REACHED(); return; } if (imageRect.width() == sourceRect.width() && !offset.x()) memcpy(pixelDest, &image[offset.y() * imageRect.width() * componentsPerPixel * bytesPerComponent], imageRect.width() * sourceRect.height() * componentsPerPixel * bytesPerComponent); else { // Strides not equal, so do a row-by-row memcpy from the // paint results into the pixelDest for (int row = 0; row < sourceRect.height(); ++row) memcpy(&pixelDest[sourceRect.width() * row * componentsPerPixel * bytesPerComponent], &image[4 * (offset.x() + (offset.y() + row) * imageRect.width())], sourceRect.width() * componentsPerPixel * bytesPerComponent); } GLC(context, context->unmapTexSubImage2DCHROMIUM(pixelDest)); }
void LayerTextureSubImage::upload(const uint8_t* image, const IntRect& imageRect, const IntRect& sourceRect, const IntSize& destOffset, GC3Denum format, WebGraphicsContext3D* context) { if (m_useMapTexSubImage) uploadWithMapTexSubImage(image, imageRect, sourceRect, destOffset, format, context); else uploadWithTexSubImage(image, imageRect, sourceRect, destOffset, format, context); }