void GDIPlus::DrawTexturedRect( Gwen::Texture* pTexture, Gwen::Rect pTargetRect, float u1, float v1, float u2, float v2 ) { Gdiplus::Bitmap* pImage = (Gdiplus::Bitmap*) pTexture->data; // Missing image, not loaded properly? if ( !pImage || pImage->GetType() == Gdiplus::ImageTypeUnknown ) return DrawMissingImage( pTargetRect ); Translate( pTargetRect ); Gdiplus::RectF TargetRect( pTargetRect.x, pTargetRect.y, pTargetRect.w, pTargetRect.h ); // Convert UV to pixel coords float fW = pImage->GetWidth(); float fH = pImage->GetHeight(); u1 *= fW; v1 *= fH; u2 *= fW; u2 -= u1; v2 *= fH; v2 -= v1; graphics->DrawImage( pImage, TargetRect, u1, v1, u2, v2, Gdiplus::UnitPixel ); }
EXPORT_C void CHuiFxGroupLayer::Draw(CHuiFxEngine& aEngine, CHuiGc& aGc, CHuiFxRenderbuffer& aTarget, CHuiFxRenderbuffer& aSource, TBool aHasSurface) { #ifdef HUIFX_TRACE RDebug::Print(_L("CHuiFxGroupLayer::Draw - 0x%x "), this); #endif // TODO: fast path CHuiFxRenderbuffer* backBuffer = &aTarget; CHuiFxRenderbuffer* sourceBuffer = &aSource; THuiFxEngineType engineType = aEngine.EngineType(); // The root group does not require a back buffer if (!iIsRoot) { backBuffer = aEngine.AcquireRenderbuffer(iBackbufferRect.Size()); if (!backBuffer) { return; } // Make sure background is enabled if needed. if (AlwaysReadSurfacePixels()) { backBuffer->EnableBackground(ETrue); backBuffer->PrepareForReuse(backBuffer->Size()); } sourceBuffer = backBuffer; // Translate the graphics context so that the content appears in the correct place backBuffer->BindAsRenderTarget(); aGc.Push(EHuiGcMatrixModel); if(engineType == EHuiFxEngineVg10) { aGc.Scale(EHuiGcMatrixModel, 1.0f, -1.0f, 1.0f); aGc.Translate(EHuiGcMatrixModel, 0.0f, -iBackbufferRect.Size().iHeight, 0.0f); } aGc.Translate(EHuiGcMatrixModel, -iBackbufferRect.iTl.iX, -iBackbufferRect.iTl.iY, 0.0f); backBuffer->UnbindAsRenderTarget(); } else if (iIsRoot && (&aTarget != aEngine.DefaultRenderbuffer())) { // We are rendering to offscreen buffer // Translate the graphics context so that the content appears in the correct place backBuffer->BindAsRenderTarget(); aGc.Push(EHuiGcMatrixModel); if(engineType == EHuiFxEngineVg10) { aGc.Scale(EHuiGcMatrixModel, 1.0f, -1.0f, 1.0f); aGc.Translate(EHuiGcMatrixModel, 0.0f, -iBackbufferRect.Size().iHeight, 0.0f); } aGc.Translate(EHuiGcMatrixModel, -iBackbufferRect.iTl.iX, -iBackbufferRect.iTl.iY, 0.0f); backBuffer->UnbindAsRenderTarget(); } for (TInt i = 0; i < iLayers.Count(); i++) { iLayers[i]->Draw(aEngine, aGc, *backBuffer, *sourceBuffer, aHasSurface); } // The root group does not support composition if (!iIsRoot) { TRect compSourceRect(TPoint(0, 0), iBackbufferRect.Size()); TInt alpha = 0xff; // TODO if(engineType == EHuiFxEngineVg10) { backBuffer->BindAsRenderTarget(); aGc.Pop(EHuiGcMatrixModel); backBuffer->UnbindAsRenderTarget(); } else { aGc.Pop(EHuiGcMatrixModel); } // Composite the result TRect compositionTargetRect(TargetRect()); compositionTargetRect.Move(-aTarget.Position()); aEngine.Composite(aTarget, *backBuffer, compositionTargetRect, compSourceRect, BlendingMode(), alpha); aEngine.ReleaseRenderbuffer(backBuffer); } else if (iIsRoot && (&aTarget != aEngine.DefaultRenderbuffer())) { // We did rendering to offscreen buffer if(engineType == EHuiFxEngineVg10) { backBuffer->BindAsRenderTarget(); aGc.Pop(EHuiGcMatrixModel); backBuffer->UnbindAsRenderTarget(); } else { aGc.Pop(EHuiGcMatrixModel); } } }