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; }
DFBResult CoreGraphicsStateClient_TextureTriangles( CoreGraphicsStateClient *client, const DFBVertex *vertices, int num, DFBTriangleFormation formation ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( vertices != NULL ); if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { // FIXME: may overwrite vertices dfb_gfxcard_texture_triangles( (DFBVertex*) vertices, num, formation, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_TEXTRIANGLES, client->state ); ret = CoreGraphicsState_TextureTriangles( client->gfx_state, vertices, num, formation ); if (ret) return ret; } return DFB_OK; }
DFBResult CoreGraphicsStateClient_TileBlit( CoreGraphicsStateClient *client, const DFBRectangle *rects, const DFBPoint *points1, const DFBPoint *points2, 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( points1 != NULL ); D_ASSERT( points2 != NULL ); if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { u32 i; // FIXME: will overwrite rects, points for (i=0; i<num; i++) dfb_gfxcard_tileblit( (DFBRectangle*) &rects[i], points1[i].x, points1[i].y, points2[i].x, points2[i].y, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_BLIT, client->state ); ret = CoreGraphicsState_TileBlit( client->gfx_state, rects, points1, points2, num ); if (ret) return ret; } return DFB_OK; }
DFBResult CoreGraphicsStateClient_Blit2( CoreGraphicsStateClient *client, const DFBRectangle *rects, const DFBPoint *points1, const DFBPoint *points2, 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( points1 != NULL ); D_ASSERT( points2 != NULL ); if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { // FIXME: will overwrite rects, points dfb_gfxcard_batchblit2( (DFBRectangle*) rects, (DFBPoint*) points1, (DFBPoint*) points2, num, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_BLIT2, client->state ); ret = CoreGraphicsState_Blit2( client->gfx_state, rects, points1, points2, num ); if (ret) return ret; } return DFB_OK; }
DFBResult CoreGraphicsStateClient_FillSpans( CoreGraphicsStateClient *client, int y, const DFBSpan *spans, unsigned int num ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( spans != NULL ); if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { // FIXME: may overwrite spans dfb_gfxcard_fillspans( y, (DFBSpan*) spans, num, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_FILLRECTANGLE, client->state ); ret = CoreGraphicsState_FillSpans( client->gfx_state, y, spans, num ); 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_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_FillTrapezoids( CoreGraphicsStateClient *client, const DFBTrapezoid *trapezoids, unsigned int num ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( trapezoids != NULL ); if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { dfb_gfxcard_filltrapezoids( trapezoids, num, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_FILLTRAPEZOID, client->state ); ret = CoreGraphicsState_FillTrapezoids( client->gfx_state, trapezoids, num ); if (ret) return ret; } return DFB_OK; }
DFBResult CoreGraphicsStateClient_DrawLines( CoreGraphicsStateClient *client, const DFBRegion *lines, unsigned int num ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( lines != NULL ); if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { // FIXME: will overwrite lines dfb_gfxcard_drawlines( (DFBRegion*) lines, num, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_DRAWLINE, client->state ); ret = CoreGraphicsState_DrawLines( client->gfx_state, lines, num ); if (ret) return ret; } return DFB_OK; }
DFBResult CoreGraphicsStateClient_DrawRectangles( CoreGraphicsStateClient *client, const DFBRectangle *rects, unsigned int num ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( rects != NULL ); if (!dfb_config->call_nodirect && (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion)) { unsigned int i; for (i=0; i<num; i++) // FIXME: will overwrite rects dfb_gfxcard_drawrectangle( (DFBRectangle*) &rects[i], client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_DRAWRECTANGLE, client->state ); ret = CoreGraphicsState_DrawRectangles( client->gfx_state, rects, 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 (num != 1) D_UNIMPLEMENTED(); if (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion) { // FIXME: will overwrite rects dfb_gfxcard_stretchblit( (DFBRectangle*) srects, (DFBRectangle*) drects, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_STRETCHBLIT, client->state ); ret = CoreGraphicsState_StretchBlit( client->gfx_state, srects, drects, num ); if (ret) return ret; } return DFB_OK; }
DFBResult CoreGraphicsStateClient_FillRectangles( CoreGraphicsStateClient *client, const DFBRectangle *rects, unsigned int num ) { D_DEBUG_AT( Core_GraphicsStateClient, "%s( client %p )\n", __FUNCTION__, client ); D_MAGIC_ASSERT( client, CoreGraphicsStateClient ); D_ASSERT( rects != NULL ); if (dfb_core_is_master( client->core ) || !fusion_config->secure_fusion) { dfb_gfxcard_fillrectangles( rects, num, client->state ); } else { DFBResult ret; CoreGraphicsStateClient_Update( client, DFXL_FILLRECTANGLE, client->state ); ret = CoreGraphicsState_FillRectangles( client->gfx_state, rects, num ); if (ret) return ret; } return DFB_OK; }