diff --git a/gfx/layers/d3d9/ImageLayerD3D9.cpp b/gfx/layers/d3d9/ImageLayerD3D9.cpp index 198bc1dbb2d4..c8ae393755f9 100644 --- a/gfx/layers/d3d9/ImageLayerD3D9.cpp +++ b/gfx/layers/d3d9/ImageLayerD3D9.cpp @@ -294,6 +294,15 @@ ImageLayerD3D9::RenderLayer() yuvImage->mSize.height), 1); + device()->SetVertexShaderConstantF(CBvTextureCoords, + ShaderConstantRect( + (float)yuvImage->mData.mPicX / yuvImage->mData.mYSize.width, + (float)yuvImage->mData.mPicY / yuvImage->mData.mYSize.height, + (float)yuvImage->mData.mPicSize.width / yuvImage->mData.mYSize.width, + (float)yuvImage->mData.mPicSize.height / yuvImage->mData.mYSize.height + ), + 1); + mD3DManager->SetShaderMode(DeviceManagerD3D9::YCBCRLAYER); /* @@ -341,6 +350,9 @@ ImageLayerD3D9::RenderLayer() device()->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); + device()->SetVertexShaderConstantF(CBvTextureCoords, + ShaderConstantRect(0, 0, 1.0f, 1.0f), 1); + } else if (image->GetFormat() == Image::CAIRO_SURFACE) { CairoImageD3D9 *cairoImage = static_cast(image.get()); @@ -393,75 +405,8 @@ PlanarYCbCrImageD3D9::PlanarYCbCrImageD3D9() void PlanarYCbCrImageD3D9::SetData(const PlanarYCbCrImage::Data &aData) { - // XXX - For D3D9Ex we really should just copy to systemmem surfaces here. - // For now, we copy the data - int width_shift = 0; - int height_shift = 0; - if (aData.mYSize.width == aData.mCbCrSize.width && - aData.mYSize.height == aData.mCbCrSize.height) { - // YV24 format - width_shift = 0; - height_shift = 0; - mType = gfx::YV24; - } else if (aData.mYSize.width / 2 == aData.mCbCrSize.width && - aData.mYSize.height == aData.mCbCrSize.height) { - // YV16 format - width_shift = 1; - height_shift = 0; - mType = gfx::YV16; - } else if (aData.mYSize.width / 2 == aData.mCbCrSize.width && - aData.mYSize.height / 2 == aData.mCbCrSize.height ) { - // YV12 format - width_shift = 1; - height_shift = 1; - mType = gfx::YV12; - } else { - NS_ERROR("YCbCr format not supported"); - } - - mData = aData; - mData.mCbCrStride = mData.mCbCrSize.width = aData.mPicSize.width >> width_shift; - // Round up the values for width and height to make sure we sample enough data - // for the last pixel - See bug 590735 - if (width_shift && (aData.mPicSize.width & 1)) { - mData.mCbCrStride++; - mData.mCbCrSize.width++; - } - mData.mCbCrSize.height = aData.mPicSize.height >> height_shift; - if (height_shift && (aData.mPicSize.height & 1)) { - mData.mCbCrSize.height++; - } - mData.mYSize = aData.mPicSize; - mData.mYStride = mData.mYSize.width; - - mBuffer = new PRUint8[mData.mCbCrStride * mData.mCbCrSize.height * 2 + - mData.mYStride * mData.mYSize.height]; - mData.mYChannel = mBuffer; - mData.mCbChannel = mData.mYChannel + mData.mYStride * mData.mYSize.height; - mData.mCrChannel = mData.mCbChannel + mData.mCbCrStride * mData.mCbCrSize.height; - - int cbcr_x = aData.mPicX >> width_shift; - int cbcr_y = aData.mPicY >> height_shift; - - for (int i = 0; i < mData.mYSize.height; i++) { - memcpy(mData.mYChannel + i * mData.mYStride, - aData.mYChannel + ((aData.mPicY + i) * aData.mYStride) + aData.mPicX, - mData.mYStride); - } - for (int i = 0; i < mData.mCbCrSize.height; i++) { - memcpy(mData.mCbChannel + i * mData.mCbCrStride, - aData.mCbChannel + ((cbcr_y + i) * aData.mCbCrStride) + cbcr_x, - mData.mCbCrStride); - } - for (int i = 0; i < mData.mCbCrSize.height; i++) { - memcpy(mData.mCrChannel + i * mData.mCbCrStride, - aData.mCrChannel + ((cbcr_y + i) * aData.mCbCrStride) + cbcr_x, - mData.mCbCrStride); - } - - // Fix picture rect to be correct - mData.mPicX = mData.mPicY = 0; - mSize = aData.mPicSize; + PRUint32 dummy; + mBuffer = CopyData(mData, mSize, dummy, aData); mHasData = PR_TRUE; } @@ -594,20 +539,26 @@ PlanarYCbCrImageD3D9::GetAsSurface() { nsRefPtr imageSurface = new gfxImageSurface(mSize, gfxASurface::ImageFormatRGB24); + + gfx::YUVType type = + gfx::TypeFromSize(mData.mYSize.width, + mData.mYSize.height, + mData.mCbCrSize.width, + mData.mCbCrSize.height); // Convert from YCbCr to RGB now gfx::ConvertYCbCrToRGB32(mData.mYChannel, mData.mCbChannel, mData.mCrChannel, imageSurface->Data(), - 0, - 0, - mSize.width, - mSize.height, + mData.mPicX, + mData.mPicY, + mData.mPicSize.width, + mData.mPicSize.height, mData.mYStride, mData.mCbCrStride, imageSurface->Stride(), - mType); + type); return imageSurface.forget().get(); } diff --git a/gfx/layers/d3d9/ImageLayerD3D9.h b/gfx/layers/d3d9/ImageLayerD3D9.h index fe52bdf5a2da..5428695ab567 100644 --- a/gfx/layers/d3d9/ImageLayerD3D9.h +++ b/gfx/layers/d3d9/ImageLayerD3D9.h @@ -134,7 +134,6 @@ public: nsRefPtr mCrTexture; nsRefPtr mCbTexture; PRPackedBool mHasData; - gfx::YUVType mType; };