DFBResult CoreGraphicsStateClient_Blit( CoreGraphicsStateClient *client, const DFBRectangle *rects, const DFBPoint *points, unsigned int num ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( rects != NULL ); D_ASSERT( points != NULL ); if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { // FIXME: will overwrite rects, points dfb_gfxcard_batchblit( (DFBRectangle*) rects, (DFBPoint*) points, num, client->state ); } else { DFBResult ret; unsigned int i; CoreGraphicsStateClient_Update( client, DFXL_BLIT, client->state ); for (i=0; i<num; i+=200) { ret = CoreGraphicsState_Blit( client->gfx_state, &rects[i], &points[i], MIN(200, num-i) ); if (ret) return ret; } } return DFB_OK; }
DFBResult CoreGraphicsStateClient_Blit( CoreGraphicsStateClient *client, const DFBRectangle *rects, const DFBPoint *points, unsigned int num ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( rects != NULL ); D_ASSERT( points != NULL ); if (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion) { // FIXME: will overwrite rects, points if (num > 1) dfb_gfxcard_batchblit( (DFBRectangle*) rects, (DFBPoint*) points, num, client->state ); else dfb_gfxcard_blit( (DFBRectangle*) rects, ((DFBPoint*)points)->x, ((DFBPoint*)points)->y, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_BLIT, client->state ); ret = CoreGraphicsState_Blit( client->gfx_state, rects, points, num ); if (ret) return ret; } return DFB_OK; }
DFBResult CoreGraphicsStateClient_StretchBlit( CoreGraphicsStateClient *client, const DFBRectangle *srects, const DFBRectangle *drects, unsigned int num ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( srects != NULL ); D_ASSERT( drects != NULL ); if (num == 0) return DFB_OK; if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { if (num == 1 && srects[0].w == drects[0].w && srects[0].h == drects[0].h) { DFBPoint point = { drects[0].x, drects[0].y }; // FIXME: will overwrite rects, points dfb_gfxcard_batchblit( (DFBRectangle*) srects, &point, 1, client->state ); } else { // FIXME: will overwrite rects dfb_gfxcard_batchstretchblit( (DFBRectangle*) srects, (DFBRectangle*) drects, num, client->state ); } } else { DFBResult ret; if (num == 1 && srects[0].w == drects[0].w && srects[0].h == drects[0].h) { CoreGraphicsStateClient_Update( client, DFXL_BLIT, client->state ); DFBPoint point = { drects[0].x, drects[0].y }; ret = CoreGraphicsState_Blit( client->gfx_state, srects, &point, 1 ); if (ret) return ret; } else { CoreGraphicsStateClient_Update( client, DFXL_STRETCHBLIT, client->state ); ret = CoreGraphicsState_StretchBlit( client->gfx_state, srects, drects, num ); if (ret) return ret; } } return DFB_OK; }