/* * @implemented */ BOOL APIENTRY NtGdiEngAlphaBlend(IN SURFOBJ *psoDest, IN SURFOBJ *psoSource, IN CLIPOBJ *ClipRegion, IN XLATEOBJ *ColorTranslation, IN PRECTL upDestRect, IN PRECTL upSourceRect, IN BLENDOBJ *BlendObj) { RECTL DestRect; RECTL SourceRect; _SEH2_TRY { ProbeForRead(upDestRect, sizeof(RECTL), 1); RtlCopyMemory(&DestRect,upDestRect, sizeof(RECTL)); ProbeForRead(upSourceRect, sizeof(RECTL), 1); RtlCopyMemory(&SourceRect, upSourceRect, sizeof(RECTL)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { _SEH2_YIELD(return FALSE); } _SEH2_END; return EngAlphaBlend(psoDest, psoSource, ClipRegion, ColorTranslation, &DestRect, &SourceRect, BlendObj); }
BOOL APIENTRY IntEngAlphaBlend( _Inout_ SURFOBJ *psoDest, _In_ SURFOBJ *psoSource, _In_opt_ CLIPOBJ *pco, _In_opt_ XLATEOBJ *pxlo, _In_ RECTL *prclDest, _In_ RECTL *prclSrc, _In_ BLENDOBJ *pBlendObj) { BOOL ret = FALSE; SURFACE *psurfDest; ASSERT(psoDest); ASSERT(psoSource); ASSERT(prclDest); ASSERT(prclSrc); //ASSERT(pBlendObj); /* If no clip object is given, use trivial one */ if (!pco) pco = &gxcoTrivial.ClipObj; /* Check if there is anything to draw */ if ((pco->rclBounds.left >= pco->rclBounds.right) || (pco->rclBounds.top >= pco->rclBounds.bottom)) { /* Nothing to do */ return TRUE; } psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); /* Call the driver's DrvAlphaBlend if available */ if (psurfDest->flags & HOOK_ALPHABLEND) { ret = GDIDEVFUNCS(psoDest).AlphaBlend( psoDest, psoSource, pco, pxlo, prclDest, prclSrc, pBlendObj); } if (!ret) { ret = EngAlphaBlend(psoDest, psoSource, pco, pxlo, prclDest, prclSrc, pBlendObj); } return ret; }
BOOL APIENTRY IntEngAlphaBlend(IN SURFOBJ *psoDest, IN SURFOBJ *psoSource, IN CLIPOBJ *ClipRegion, IN XLATEOBJ *ColorTranslation, IN PRECTL DestRect, IN PRECTL SourceRect, IN BLENDOBJ *BlendObj) { BOOL ret = FALSE; SURFACE *psurfDest; SURFACE *psurfSource; ASSERT(psoDest); psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj); ASSERT(psoSource); psurfSource = CONTAINING_RECORD(psoSource, SURFACE, SurfObj); ASSERT(DestRect); ASSERT(SourceRect); /* Check if there is anything to draw */ if (ClipRegion != NULL && (ClipRegion->rclBounds.left >= ClipRegion->rclBounds.right || ClipRegion->rclBounds.top >= ClipRegion->rclBounds.bottom)) { /* Nothing to do */ return TRUE; } /* Call the driver's DrvAlphaBlend if available */ if (psurfDest->flags & HOOK_ALPHABLEND) { ret = GDIDEVFUNCS(psoDest).AlphaBlend( psoDest, psoSource, ClipRegion, ColorTranslation, DestRect, SourceRect, BlendObj); } if (! ret) { ret = EngAlphaBlend(psoDest, psoSource, ClipRegion, ColorTranslation, DestRect, SourceRect, BlendObj); } return ret; }