Пример #1
0
		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 );
			
		}
Пример #2
0
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);
            }                            
        }
    }