From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- .../proxy/dispatcher/idirectfbsurface_dispatcher.c | 2149 ++++++++++++++++++++ 1 file changed, 2149 insertions(+) create mode 100755 Source/DirectFB/proxy/dispatcher/idirectfbsurface_dispatcher.c (limited to 'Source/DirectFB/proxy/dispatcher/idirectfbsurface_dispatcher.c') diff --git a/Source/DirectFB/proxy/dispatcher/idirectfbsurface_dispatcher.c b/Source/DirectFB/proxy/dispatcher/idirectfbsurface_dispatcher.c new file mode 100755 index 0000000..9c38dcc --- /dev/null +++ b/Source/DirectFB/proxy/dispatcher/idirectfbsurface_dispatcher.c @@ -0,0 +1,2149 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include + +#include +#include +#include + +#include + + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "idirectfbsurface_dispatcher.h" + +static DFBResult Probe( void ); +static DFBResult Construct( IDirectFBSurface *thiz, + IDirectFBSurface *real, + VoodooManager *manager, + VoodooInstanceID super, + void *arg, + VoodooInstanceID *ret_instance ); + +#include + +DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBSurface, Dispatcher ) + +/**************************************************************************************************/ + +/* + * private data struct of IDirectFBSurface_Dispatcher + */ +typedef struct { + int ref; /* reference counter */ + + IDirectFBSurface *real; + + VoodooInstanceID super; + VoodooInstanceID self; + + VoodooManager *manager; + + VoodooInstanceID remote; +} IDirectFBSurface_Dispatcher_data; + +/**************************************************************************************************/ + +static void +IDirectFBSurface_Dispatcher_Destruct( IDirectFBSurface *thiz ) +{ + IDirectFBSurface_Dispatcher_data *data; + + D_DEBUG( "%s (%p)\n", __FUNCTION__, thiz ); + + data = thiz->priv; + + data->real->Release( data->real ); + + DIRECT_DEALLOCATE_INTERFACE( thiz ); +} + +/**************************************************************************************************/ + +static DirectResult +IDirectFBSurface_Dispatcher_AddRef( IDirectFBSurface *thiz ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + data->ref++; + + return DFB_OK; +} + +static DirectResult +IDirectFBSurface_Dispatcher_Release( IDirectFBSurface *thiz ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (--data->ref == 0) + IDirectFBSurface_Dispatcher_Destruct( thiz ); + + return DFB_OK; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetCapabilities( IDirectFBSurface *thiz, + DFBSurfaceCapabilities *caps ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!caps) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetPosition( IDirectFBSurface *thiz, + int *x, + int *y ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!x && !y) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetSize( IDirectFBSurface *thiz, + int *width, + int *height ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!width && !height) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetVisibleRectangle( IDirectFBSurface *thiz, + DFBRectangle *rect ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!rect) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetPixelFormat( IDirectFBSurface *thiz, + DFBSurfacePixelFormat *format ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!format) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetAccelerationMask( IDirectFBSurface *thiz, + IDirectFBSurface *source, + DFBAccelerationMask *mask ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!mask) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetPalette( IDirectFBSurface *thiz, + IDirectFBPalette **interface_ptr ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!interface_ptr) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetPalette( IDirectFBSurface *thiz, + IDirectFBPalette *palette ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!palette) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetAlphaRamp( IDirectFBSurface *thiz, + u8 a0, u8 a1, u8 a2, u8 a3 ) + +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_Lock( IDirectFBSurface *thiz, + DFBSurfaceLockFlags flags, + void **ret_ptr, int *ret_pitch ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!flags || !ret_ptr || !ret_pitch) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetFramebufferOffset( IDirectFBSurface *thiz, + int *offset ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!offset) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_Unlock( IDirectFBSurface *thiz ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_Flip( IDirectFBSurface *thiz, + const DFBRegion *region, + DFBSurfaceFlipFlags flags ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetField( IDirectFBSurface *thiz, + int field ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (field < 0 || field > 1) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_Clear( IDirectFBSurface *thiz, + u8 r, u8 g, u8 b, u8 a ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetClip( IDirectFBSurface *thiz, + const DFBRegion *clip ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetClip( IDirectFBSurface *thiz, + DFBRegion *clip ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!clip) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetColor( IDirectFBSurface *thiz, + u8 r, u8 g, u8 b, u8 a ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetColorIndex( IDirectFBSurface *thiz, + unsigned int index ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetSrcBlendFunction( IDirectFBSurface *thiz, + DFBSurfaceBlendFunction src ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetDstBlendFunction( IDirectFBSurface *thiz, + DFBSurfaceBlendFunction dst ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetPorterDuff( IDirectFBSurface *thiz, + DFBSurfacePorterDuffRule rule ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetSrcColorKey( IDirectFBSurface *thiz, + u8 r, + u8 g, + u8 b ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetSrcColorKeyIndex( IDirectFBSurface *thiz, + unsigned int index ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetDstColorKey( IDirectFBSurface *thiz, + u8 r, + u8 g, + u8 b ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetDstColorKeyIndex( IDirectFBSurface *thiz, + unsigned int index ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetFont( IDirectFBSurface *thiz, + IDirectFBFont *font ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetFont( IDirectFBSurface *thiz, + IDirectFBFont **font ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetDrawingFlags( IDirectFBSurface *thiz, + DFBSurfaceDrawingFlags flags ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_FillRectangle( IDirectFBSurface *thiz, + int x, int y, int w, int h ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_FillRectangles( IDirectFBSurface *thiz, + const DFBRectangle *rects, + unsigned int num_rects ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_FillSpans( IDirectFBSurface *thiz, + int y, + const DFBSpan *spans, + unsigned int num_spans ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + + +static DFBResult +IDirectFBSurface_Dispatcher_DrawLine( IDirectFBSurface *thiz, + int x1, int y1, int x2, int y2 ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_DrawLines( IDirectFBSurface *thiz, + const DFBRegion *lines, + unsigned int num_lines ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!lines || !num_lines) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_DrawRectangle( IDirectFBSurface *thiz, + int x, int y, int w, int h ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (w<=0 || h<=0) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_FillTriangle( IDirectFBSurface *thiz, + int x1, int y1, + int x2, int y2, + int x3, int y3 ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetBlittingFlags( IDirectFBSurface *thiz, + DFBSurfaceBlittingFlags flags ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_Blit( IDirectFBSurface *thiz, + IDirectFBSurface *source, + const DFBRectangle *rect, + int x, + int y ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!source) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_TileBlit( IDirectFBSurface *thiz, + IDirectFBSurface *source, + const DFBRectangle *rect, + int x, + int y ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!source) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_BatchBlit( IDirectFBSurface *thiz, + IDirectFBSurface *source, + const DFBRectangle *source_rects, + const DFBPoint *dest_points, + int num ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!source || !source_rects || !dest_points || num < 1) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_StretchBlit( IDirectFBSurface *thiz, + IDirectFBSurface *source, + const DFBRectangle *source_rect, + const DFBRectangle *destination_rect ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!source) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_TextureTriangles( IDirectFBSurface *thiz, + IDirectFBSurface *source, + const DFBVertex *vertices, + const int *indices, + int num, + DFBTriangleFormation formation ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!source || !vertices || num < 3) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_DrawString( IDirectFBSurface *thiz, + const char *text, int bytes, + int x, int y, + DFBSurfaceTextFlags flags ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!text) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_DrawGlyph( IDirectFBSurface *thiz, + unsigned int index, int x, int y, + DFBSurfaceTextFlags flags ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!index) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetEncoding( IDirectFBSurface *thiz, + DFBTextEncodingID encoding ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetSubSurface( IDirectFBSurface *thiz, + const DFBRectangle *rect, + IDirectFBSurface **surface ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!surface) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_GetGL( IDirectFBSurface *thiz, + IDirectFBGL **interface_ptr ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!interface_ptr) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_Dump( IDirectFBSurface *thiz, + const char *directory, + const char *prefix ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + if (!directory || !prefix) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_DisableAcceleration( IDirectFBSurface *thiz, + DFBAccelerationMask mask ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_ReleaseSource( IDirectFBSurface *thiz ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBSurface_Dispatcher_SetIndexTranslation( IDirectFBSurface *thiz, + const int *indices, + int num_indices ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +/**************************************************************************************************/ + +static DirectResult +Dispatch_Release( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + return voodoo_manager_unregister_local( manager, data->self ); +} + +static DirectResult +Dispatch_GetPosition( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DFBResult ret; + DFBPoint position; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + ret = real->GetPosition( real, &position.x, &position.y ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_DATA, sizeof(DFBPoint), &position, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetSize( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DFBResult ret; + DFBDimension dimension; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + ret = real->GetSize( real, &dimension.w, &dimension.h ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_DATA, sizeof(DFBDimension), &dimension, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetVisibleRectangle( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DFBResult ret; + DFBRectangle rect; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + ret = real->GetVisibleRectangle( real, &rect ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_DATA, sizeof(DFBRectangle), &rect, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetPixelFormat( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DFBResult ret; + DFBSurfacePixelFormat format; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + ret = real->GetPixelFormat( real, &format ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_INT, format, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetAccelerationMask( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + VoodooInstanceID instance; + void *surface = NULL; + DFBAccelerationMask mask; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, instance ); + VOODOO_PARSER_END( parser ); + + if (instance != VOODOO_INSTANCE_NONE) { + ret = voodoo_manager_lookup_local( manager, instance, NULL, &surface ); + if (ret) + return ret; + } + + ret = real->GetAccelerationMask( real, surface, &mask ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_INT, mask, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetPalette( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + IDirectFBPalette *palette; + VoodooInstanceID instance; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + ret = real->GetPalette( real, &palette ); + if (ret) + return ret; + + ret = voodoo_construct_dispatcher( manager, "IDirectFBPalette", palette, + data->super, NULL, &instance, NULL ); + if (ret) { + palette->Release( palette ); + return ret; + } + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, instance, + VMBT_NONE ); +} + +static DirectResult +Dispatch_SetPalette( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + VoodooInstanceID instance; + void *palette; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, instance ); + VOODOO_PARSER_END( parser ); + + ret = voodoo_manager_lookup_local( manager, instance, NULL, &palette ); + if (ret) + return ret; + + real->SetPalette( real, palette ); + + return DFB_OK; +} + +static DirectResult +Dispatch_Flip( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + const DFBRegion *region; + DFBSurfaceFlipFlags flags; + unsigned int millis; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ODATA( parser, region ); + VOODOO_PARSER_GET_INT( parser, flags ); + if (data->remote) + VOODOO_PARSER_GET_UINT( parser, millis ); + VOODOO_PARSER_END( parser ); + + ret = real->Flip( real, region, flags ); + + if (data->remote) + voodoo_manager_request( manager, data->remote, + IDIRECTFBSURFACE_REQUESTOR_METHOD_ID_FlipNotify, VREQ_NONE, NULL, + VMBT_UINT, millis, + VMBT_NONE ); + + if (flags & DSFLIP_WAIT) + return voodoo_manager_respond( manager, true, msg->header.serial, + ret, VOODOO_INSTANCE_NONE, + VMBT_NONE ); + + return DFB_OK; +} + +static DirectResult +Dispatch_Clear( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBColor *color; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, color ); + VOODOO_PARSER_END( parser ); + + real->Clear( real, color->r, color->g, color->b, color->a ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetClip( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBRegion *clip; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ODATA( parser, clip ); + VOODOO_PARSER_END( parser ); + + real->SetClip( real, clip ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetColor( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBColor *color; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, color ); + VOODOO_PARSER_END( parser ); + + real->SetColor( real, color->r, color->g, color->b, color->a ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetSrcColorKey( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBColor *color; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, color ); + VOODOO_PARSER_END( parser ); + + real->SetSrcColorKey( real, color->r, color->g, color->b ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetSrcColorKeyIndex( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + unsigned int index; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, index ); + VOODOO_PARSER_END( parser ); + + real->SetSrcColorKeyIndex( real, index ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetDstColorKey( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBColor *color; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, color ); + VOODOO_PARSER_END( parser ); + + real->SetDstColorKey( real, color->r, color->g, color->b ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetDstColorKeyIndex( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + unsigned int index; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, index ); + VOODOO_PARSER_END( parser ); + + real->SetDstColorKeyIndex( real, index ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetBlittingFlags( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + DFBSurfaceBlittingFlags flags; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_INT( parser, flags ); + VOODOO_PARSER_END( parser ); + + real->SetBlittingFlags( real, flags ); + + return DFB_OK; +} + +static DirectResult +Dispatch_Blit( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + VoodooInstanceID instance; + const DFBRectangle *rect; + const DFBPoint *point; + void *surface; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, instance ); + VOODOO_PARSER_GET_ODATA( parser, rect ); + VOODOO_PARSER_GET_DATA( parser, point ); + VOODOO_PARSER_END( parser ); + + ret = voodoo_manager_lookup_local( manager, instance, NULL, &surface ); + if (ret) + return ret; + + real->Blit( real, surface, rect, point->x, point->y ); + + return DFB_OK; +} + +static DirectResult +Dispatch_TileBlit( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + VoodooInstanceID instance; + const DFBRectangle *rect; + const DFBPoint *point; + void *surface; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, instance ); + VOODOO_PARSER_GET_ODATA( parser, rect ); + VOODOO_PARSER_GET_DATA( parser, point ); + VOODOO_PARSER_END( parser ); + + ret = voodoo_manager_lookup_local( manager, instance, NULL, &surface ); + if (ret) + return ret; + + real->TileBlit( real, surface, rect, point->x, point->y ); + + return DFB_OK; +} + +static DirectResult +Dispatch_BatchBlit( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + VoodooInstanceID instance; + unsigned int num; + const DFBRectangle *source_rects; + const DFBPoint *dest_points; + void *surface; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, instance ); + VOODOO_PARSER_GET_UINT( parser, num ); + VOODOO_PARSER_GET_DATA( parser, source_rects ); + VOODOO_PARSER_GET_DATA( parser, dest_points ); + VOODOO_PARSER_END( parser ); + + ret = voodoo_manager_lookup_local( manager, instance, NULL, &surface ); + if (ret) + return ret; + + real->BatchBlit( real, surface, source_rects, dest_points, num ); + + return DFB_OK; +} + +static DirectResult +Dispatch_StretchBlit( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + VoodooInstanceID instance; + const DFBRectangle *srect; + const DFBRectangle *drect; + void *surface; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, instance ); + VOODOO_PARSER_GET_ODATA( parser, srect ); + VOODOO_PARSER_GET_ODATA( parser, drect ); + VOODOO_PARSER_END( parser ); + + ret = voodoo_manager_lookup_local( manager, instance, NULL, &surface ); + if (ret) + return ret; + + real->StretchBlit( real, surface, srect, drect ); + + return DFB_OK; +} + +static DirectResult +Dispatch_TextureTriangles( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + VoodooInstanceID instance; + const DFBVertex *vertices; + const int *indices; + int num; + DFBTriangleFormation formation; + void *surface; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, instance ); + VOODOO_PARSER_GET_DATA( parser, vertices ); + VOODOO_PARSER_GET_ODATA( parser, indices ); + VOODOO_PARSER_GET_INT( parser, num ); + VOODOO_PARSER_GET_INT( parser, formation ); + VOODOO_PARSER_END( parser ); + + ret = voodoo_manager_lookup_local( manager, instance, NULL, &surface ); + if (ret) + return ret; + + real->TextureTriangles( real, surface, vertices, indices, num, formation ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetDrawingFlags( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + DFBSurfaceDrawingFlags flags; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_INT( parser, flags ); + VOODOO_PARSER_END( parser ); + + real->SetDrawingFlags( real, flags ); + + return DFB_OK; +} + +static DirectResult +Dispatch_FillRectangle( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBRectangle *rect; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, rect ); + VOODOO_PARSER_END( parser ); + + real->FillRectangle( real, rect->x, rect->y, rect->w, rect->h ); + + return DFB_OK; +} + +static DirectResult +Dispatch_FillRectangles( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + unsigned int num_rects; + const DFBRectangle *rects; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, num_rects ); + VOODOO_PARSER_GET_DATA( parser, rects ); + VOODOO_PARSER_END( parser ); + + real->FillRectangles( real, rects, num_rects ); + + return DFB_OK; +} + +static DirectResult +Dispatch_FillSpans( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + int y; + unsigned int num_spans; + const DFBSpan *spans; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_INT( parser, y ); + VOODOO_PARSER_GET_UINT( parser, num_spans ); + VOODOO_PARSER_GET_DATA( parser, spans ); + VOODOO_PARSER_END( parser ); + + real->FillSpans( real, y, spans, num_spans ); + + return DFB_OK; +} + +static DirectResult +Dispatch_DrawLine( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBRegion *line; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, line ); + VOODOO_PARSER_END( parser ); + + real->DrawLine( real, line->x1, line->y1, line->x2, line->y2 ); + + return DFB_OK; +} + +static DirectResult +Dispatch_DrawLines( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + unsigned int num_lines; + const DFBRegion *lines; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, num_lines ); + VOODOO_PARSER_GET_DATA( parser, lines ); + VOODOO_PARSER_END( parser ); + + real->DrawLines( real, lines, num_lines ); + + return DFB_OK; +} + +static DirectResult +Dispatch_DrawRectangle( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBRectangle *rect; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, rect ); + VOODOO_PARSER_END( parser ); + + real->DrawRectangle( real, rect->x, rect->y, rect->w, rect->h ); + + return DFB_OK; +} + +static DirectResult +Dispatch_FillTriangle( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const DFBTriangle *tri; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, tri ); + VOODOO_PARSER_END( parser ); + + real->FillTriangle( real, tri->x1, tri->y1, tri->x2, tri->y2, tri->x3, tri->y3 ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetFont( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + VoodooInstanceID instance; + void *font; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, instance ); + VOODOO_PARSER_END( parser ); + + if (instance == VOODOO_INSTANCE_NONE) { + real->SetFont( real, NULL ); + + return DFB_OK; + } + + ret = voodoo_manager_lookup_local( manager, instance, NULL, &font ); + if (ret) + return ret; + + real->SetFont( real, font ); + + return DFB_OK; +} + +static DirectResult +Dispatch_DrawString( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const char *text; + int bytes; + const DFBPoint *point; + DFBSurfaceTextFlags flags; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, text ); + VOODOO_PARSER_GET_INT( parser, bytes ); + VOODOO_PARSER_GET_DATA( parser, point ); + VOODOO_PARSER_GET_INT( parser, flags ); + VOODOO_PARSER_END( parser ); + + real->DrawString( real, text, bytes, point->x, point->y, flags ); + + return DFB_OK; +} + +static DirectResult +Dispatch_DrawGlyph( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + unsigned int index; + const DFBPoint *point; + DFBSurfaceTextFlags flags; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, index ); + VOODOO_PARSER_GET_DATA( parser, point ); + VOODOO_PARSER_GET_INT( parser, flags ); + VOODOO_PARSER_END( parser ); + + real->DrawGlyph( real, index, point->x, point->y, flags ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetEncoding( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + DFBTextEncodingID encoding; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, encoding ); + VOODOO_PARSER_END( parser ); + + real->SetEncoding( real, encoding ); + + return DFB_OK; +} + +static DirectResult +Dispatch_GetSubSurface( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + const DFBRectangle *rect; + IDirectFBSurface *surface; + VoodooInstanceID instance; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ODATA( parser, rect ); + VOODOO_PARSER_END( parser ); + + ret = real->GetSubSurface( real, rect, &surface ); + if (ret) + return ret; + + ret = voodoo_construct_dispatcher( manager, "IDirectFBSurface", surface, + data->super, NULL, &instance, NULL ); + if (ret) { + surface->Release( surface ); + return ret; + } + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, instance, + VMBT_NONE ); +} + +static DirectResult +Dispatch_DisableAcceleration( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + DFBAccelerationMask mask; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_INT( parser, mask ); + VOODOO_PARSER_END( parser ); + + real->DisableAcceleration( real, mask ); + + return DFB_OK; +} + +static DirectResult +Dispatch_ReleaseSource( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + real->ReleaseSource( real ); + + return DFB_OK; +} + +#define RLE16_KEY 0xf001 + +static void +rle16_decode( const u16 *src, + u16 *dst, + unsigned int num ) +{ + unsigned int n = 0, last, count, out = 0; + + while (out < num) { + last = src[n++]; + + if (last == RLE16_KEY) { + count = src[n++]; + + if (count == RLE16_KEY) { + dst[out++] = RLE16_KEY; + } + else { + last = src[n++]; + + while (count >= 4) { + dst[out+0] = + dst[out+1] = + dst[out+2] = + dst[out+3] = last; + + out += 4; + count -= 4; + } + + while (count >= 2) { + dst[out+0] = + dst[out+1] = last; + + out += 2; + count -= 2; + } + + while (count--) + dst[out++] = last; + } + } + else + dst[out++] = last; + } + + D_ASSERT( out == num ); +} + +#define RLE32_KEY 0xf0012345 + +static void +rle32_decode( const u32 *src, + u32 *dst, + unsigned int num ) +{ + unsigned int n = 0, last, count, out = 0; + + while (out < num) { + last = src[n++]; + + if (last == RLE32_KEY) { + count = src[n++]; + + if (count == RLE32_KEY) { + dst[out++] = RLE32_KEY; + } + else { + last = src[n++]; + + while (count >= 4) { + dst[out+0] = + dst[out+1] = + dst[out+2] = + dst[out+3] = last; + + out += 4; + count -= 4; + } + + while (count >= 2) { + dst[out+0] = + dst[out+1] = last; + + out += 2; + count -= 2; + } + + while (count--) + dst[out++] = last; + } + } + else + dst[out++] = last; + } + + D_ASSERT( out == num ); +} + +static DirectResult +Dispatch_Write( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + unsigned int encoded; + const DFBRectangle *rect; + const void *ptr; + int pitch; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, encoded ); + VOODOO_PARSER_GET_DATA( parser, rect ); + VOODOO_PARSER_GET_DATA( parser, ptr ); + VOODOO_PARSER_GET_INT( parser, pitch ); + VOODOO_PARSER_END( parser ); + + if (encoded) { + switch (encoded) { + case 2: { + if (rect->w > 2048) { + u16 *buf = D_MALLOC( rect->w * 2 ); + + if (buf) { + rle16_decode( ptr, buf, rect->w ); + + real->Write( real, rect, buf, pitch ); + + D_FREE( buf ); + } + else + D_OOM(); + } + else { + u16 buf[2048]; + + rle16_decode( ptr, buf, rect->w ); + + real->Write( real, rect, buf, pitch ); + } + break; + } + + case 4: { + if (rect->w > 1024) { + u32 *buf = D_MALLOC( rect->w * 4 ); + + if (buf) { + rle32_decode( ptr, buf, rect->w ); + + real->Write( real, rect, buf, pitch ); + + D_FREE( buf ); + } + else + D_OOM(); + } + else { + u32 buf[1024]; + + rle32_decode( ptr, buf, rect->w ); + + real->Write( real, rect, buf, pitch ); + } + break; + } + + default: + D_UNIMPLEMENTED(); + break; + } + } + else + real->Write( real, rect, ptr, pitch ); + + return DFB_OK; +} + +#define RLE16_KEY 0xf001 + +static bool +rle16_encode( const u16 *src, + u16 *dst, + unsigned int num, + unsigned int *ret_num ) +{ + unsigned int n, last, count = 0, out = 0; + + for (n=0; n num) { + *ret_num = num; + return false; + } + + if (count > 0) { + D_ASSERT( src[n] == last ); + + count++; + } + else { + count = 1; + last = src[n]; + } + + if (n == num-1 || src[n+1] != last) { + if (count > 2 || (count > 1 && last == RLE16_KEY)) { + dst[out++] = RLE16_KEY; + dst[out++] = count; + dst[out++] = last; + } + else { + if (count > 1 || last == RLE16_KEY) + dst[out++] = last; + + dst[out++] = last; + } + + count = 0; + } + } + + *ret_num = out; + + return true; +} + +#define RLE32_KEY 0xf0012345 + +static bool +rle32_encode( const u32 *src, + u32 *dst, + unsigned int num, + unsigned int *ret_num ) +{ + unsigned int n, last, count = 0, out = 0; + + for (n=0; n num) { + *ret_num = num; + return false; + } + + if (count > 0) { + D_ASSERT( src[n] == last ); + + count++; + } + else { + count = 1; + last = src[n]; + } + + if (n == num-1 || src[n+1] != last) { + if (count > 2 || (count > 1 && last == RLE32_KEY)) { + dst[out++] = RLE32_KEY; + dst[out++] = count; + dst[out++] = last; + } + else { + if (count > 1 || last == RLE32_KEY) + dst[out++] = last; + + dst[out++] = last; + } + + count = 0; + } + } + + *ret_num = out; + + return true; +} + +static DirectResult +Dispatch_Read( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + const DFBRectangle *rect; + int len; + int y; + void *buf; + DFBSurfacePixelFormat format; + unsigned int encoded; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, rect ); + VOODOO_PARSER_END( parser ); + + real->GetPixelFormat( real, &format ); + + len = DFB_BYTES_PER_LINE( format, rect->w ); + buf = alloca( len ); + + + switch (voodoo_config->compression_min ? DSPF_UNKNOWN : format) { + case DSPF_RGB16: { + u16 tmp[rect->w]; + + for (y=0; yh; y++) { + unsigned int num; + DFBRectangle r = { rect->x, rect->y + y, rect->w, 1 }; + + real->Read( real, &r, buf, len ); + + encoded = rle16_encode( buf, tmp, rect->w, &num ); + + ret = voodoo_manager_respond( manager, y == rect->h - 1, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_UINT, encoded ? 2 : 0, + VMBT_DATA, DFB_BYTES_PER_LINE( format, num ), + encoded ? tmp : buf, + VMBT_NONE ); + if (ret) + break; + } + break; + } + + case DSPF_RGB32: + case DSPF_ARGB: { + u32 tmp[rect->w]; + + for (y=0; yh; y++) { + unsigned int num; + DFBRectangle r = { rect->x, rect->y + y, rect->w, 1 }; + + real->Read( real, &r, buf, len ); + + encoded = rle32_encode( buf, tmp, rect->w, &num ); + + ret = voodoo_manager_respond( manager, y == rect->h - 1, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_UINT, encoded ? 4 : 0, + VMBT_DATA, DFB_BYTES_PER_LINE( format, num ), + encoded ? tmp : buf, + VMBT_NONE ); + if (ret) + break; + } + break; + } + + default: + for (y=0; yh; y++) { + DFBRectangle r = { rect->x, rect->y + y, rect->w, 1 }; + + real->Read( real, &r, buf, len ); + + voodoo_manager_respond( manager, y == rect->h - 1, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_UINT, 0, + VMBT_DATA, len, buf, + VMBT_NONE ); + } + break; + } + + return DFB_OK; +} + +static DirectResult +Dispatch_SetRenderOptions( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + DFBSurfaceRenderOptions options; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_INT( parser, options ); + VOODOO_PARSER_END( parser ); + + real->SetRenderOptions( real, options ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetMatrix( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + const s32 *matrix; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, matrix ); + VOODOO_PARSER_END( parser ); + + real->SetMatrix( real, matrix ); + + return DFB_OK; +} + +static DirectResult +Dispatch_SetRemoteInstance( IDirectFBSurface *thiz, IDirectFBSurface *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + VoodooMessageParser parser; + + DIRECT_INTERFACE_GET_DATA(IDirectFBSurface_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_ID( parser, data->remote ); + VOODOO_PARSER_END( parser ); + + return voodoo_manager_respond( manager, true, msg->header.serial, DR_OK, VOODOO_INSTANCE_NONE, VMBT_NONE ); +} + +static DirectResult +Dispatch( void *dispatcher, void *real, VoodooManager *manager, VoodooRequestMessage *msg ) +{ + D_DEBUG( "IDirectFBSurface/Dispatcher: " + "Handling request for instance %u with method %u...\n", msg->instance, msg->method ); + + switch (msg->method) { + case IDIRECTFBSURFACE_METHOD_ID_Release: + return Dispatch_Release( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_GetPosition: + return Dispatch_GetPosition( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_GetSize: + return Dispatch_GetSize( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_GetVisibleRectangle: + return Dispatch_GetVisibleRectangle( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_GetPixelFormat: + return Dispatch_GetPixelFormat( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_GetAccelerationMask: + return Dispatch_GetAccelerationMask( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_GetPalette: + return Dispatch_GetPalette( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetPalette: + return Dispatch_SetPalette( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_Flip: + return Dispatch_Flip( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_Clear: + return Dispatch_Clear( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetClip: + return Dispatch_SetClip( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetColor: + return Dispatch_SetColor( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetSrcColorKey: + return Dispatch_SetSrcColorKey( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetSrcColorKeyIndex: + return Dispatch_SetSrcColorKeyIndex( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetDstColorKey: + return Dispatch_SetDstColorKey( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetDstColorKeyIndex: + return Dispatch_SetDstColorKeyIndex( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetBlittingFlags: + return Dispatch_SetBlittingFlags( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_Blit: + return Dispatch_Blit( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_TileBlit: + return Dispatch_TileBlit( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_BatchBlit: + return Dispatch_BatchBlit( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_StretchBlit: + return Dispatch_StretchBlit( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_TextureTriangles: + return Dispatch_TextureTriangles( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetDrawingFlags: + return Dispatch_SetDrawingFlags( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_FillRectangle: + return Dispatch_FillRectangle( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_DrawLine: + return Dispatch_DrawLine( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_DrawLines: + return Dispatch_DrawLines( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_DrawRectangle: + return Dispatch_DrawRectangle( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_FillTriangle: + return Dispatch_FillTriangle( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetFont: + return Dispatch_SetFont( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_DrawString: + return Dispatch_DrawString( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_DrawGlyph: + return Dispatch_DrawGlyph( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetEncoding: + return Dispatch_SetEncoding( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_GetSubSurface: + return Dispatch_GetSubSurface( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_FillRectangles: + return Dispatch_FillRectangles( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_FillSpans: + return Dispatch_FillSpans( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_DisableAcceleration: + return Dispatch_DisableAcceleration( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_ReleaseSource: + return Dispatch_ReleaseSource( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_Write: + return Dispatch_Write( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_Read: + return Dispatch_Read( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetRenderOptions: + return Dispatch_SetRenderOptions( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetMatrix: + return Dispatch_SetMatrix( dispatcher, real, manager, msg ); + + case IDIRECTFBSURFACE_METHOD_ID_SetRemoteInstance: + return Dispatch_SetRemoteInstance( dispatcher, real, manager, msg ); + } + + return DFB_NOSUCHMETHOD; +} + +/**************************************************************************************************/ + +static DFBResult +Probe() +{ + /* This implementation has to be loaded explicitly. */ + return DFB_UNSUPPORTED; +} + +static DFBResult +Construct( IDirectFBSurface *thiz, + IDirectFBSurface *real, + VoodooManager *manager, + VoodooInstanceID super, + void *arg, /* Optional arguments to constructor */ + VoodooInstanceID *ret_instance ) +{ + DFBResult ret; + + DIRECT_ALLOCATE_INTERFACE_DATA(thiz, IDirectFBSurface_Dispatcher) + + ret = voodoo_manager_register_local( manager, super, thiz, real, Dispatch, ret_instance ); + if (ret) { + DIRECT_DEALLOCATE_INTERFACE( thiz ); + return ret; + } + + data->ref = 1; + data->real = real; + data->super = super; + data->self = *ret_instance; + data->manager = manager; + + thiz->AddRef = IDirectFBSurface_Dispatcher_AddRef; + thiz->Release = IDirectFBSurface_Dispatcher_Release; + + thiz->GetCapabilities = IDirectFBSurface_Dispatcher_GetCapabilities; + thiz->GetPosition = IDirectFBSurface_Dispatcher_GetPosition; + thiz->GetSize = IDirectFBSurface_Dispatcher_GetSize; + thiz->GetVisibleRectangle = IDirectFBSurface_Dispatcher_GetVisibleRectangle; + thiz->GetPixelFormat = IDirectFBSurface_Dispatcher_GetPixelFormat; + thiz->GetAccelerationMask = IDirectFBSurface_Dispatcher_GetAccelerationMask; + + thiz->GetPalette = IDirectFBSurface_Dispatcher_GetPalette; + thiz->SetPalette = IDirectFBSurface_Dispatcher_SetPalette; + thiz->SetAlphaRamp = IDirectFBSurface_Dispatcher_SetAlphaRamp; + + thiz->Lock = IDirectFBSurface_Dispatcher_Lock; + thiz->GetFramebufferOffset = IDirectFBSurface_Dispatcher_GetFramebufferOffset; + thiz->Unlock = IDirectFBSurface_Dispatcher_Unlock; + thiz->Flip = IDirectFBSurface_Dispatcher_Flip; + thiz->SetField = IDirectFBSurface_Dispatcher_SetField; + thiz->Clear = IDirectFBSurface_Dispatcher_Clear; + + thiz->SetClip = IDirectFBSurface_Dispatcher_SetClip; + thiz->GetClip = IDirectFBSurface_Dispatcher_GetClip; + thiz->SetColor = IDirectFBSurface_Dispatcher_SetColor; + thiz->SetColorIndex = IDirectFBSurface_Dispatcher_SetColorIndex; + thiz->SetSrcBlendFunction = IDirectFBSurface_Dispatcher_SetSrcBlendFunction; + thiz->SetDstBlendFunction = IDirectFBSurface_Dispatcher_SetDstBlendFunction; + thiz->SetPorterDuff = IDirectFBSurface_Dispatcher_SetPorterDuff; + thiz->SetSrcColorKey = IDirectFBSurface_Dispatcher_SetSrcColorKey; + thiz->SetSrcColorKeyIndex = IDirectFBSurface_Dispatcher_SetSrcColorKeyIndex; + thiz->SetDstColorKey = IDirectFBSurface_Dispatcher_SetDstColorKey; + thiz->SetDstColorKeyIndex = IDirectFBSurface_Dispatcher_SetDstColorKeyIndex; + + thiz->SetBlittingFlags = IDirectFBSurface_Dispatcher_SetBlittingFlags; + thiz->Blit = IDirectFBSurface_Dispatcher_Blit; + thiz->TileBlit = IDirectFBSurface_Dispatcher_TileBlit; + thiz->BatchBlit = IDirectFBSurface_Dispatcher_BatchBlit; + thiz->StretchBlit = IDirectFBSurface_Dispatcher_StretchBlit; + thiz->TextureTriangles = IDirectFBSurface_Dispatcher_TextureTriangles; + + thiz->SetDrawingFlags = IDirectFBSurface_Dispatcher_SetDrawingFlags; + thiz->FillRectangle = IDirectFBSurface_Dispatcher_FillRectangle; + thiz->FillRectangles = IDirectFBSurface_Dispatcher_FillRectangles; + thiz->FillSpans = IDirectFBSurface_Dispatcher_FillSpans; + thiz->DrawLine = IDirectFBSurface_Dispatcher_DrawLine; + thiz->DrawLines = IDirectFBSurface_Dispatcher_DrawLines; + thiz->DrawRectangle = IDirectFBSurface_Dispatcher_DrawRectangle; + thiz->FillTriangle = IDirectFBSurface_Dispatcher_FillTriangle; + + thiz->SetFont = IDirectFBSurface_Dispatcher_SetFont; + thiz->GetFont = IDirectFBSurface_Dispatcher_GetFont; + thiz->DrawString = IDirectFBSurface_Dispatcher_DrawString; + thiz->DrawGlyph = IDirectFBSurface_Dispatcher_DrawGlyph; + thiz->SetEncoding = IDirectFBSurface_Dispatcher_SetEncoding; + + thiz->GetSubSurface = IDirectFBSurface_Dispatcher_GetSubSurface; + + thiz->GetGL = IDirectFBSurface_Dispatcher_GetGL; + + thiz->Dump = IDirectFBSurface_Dispatcher_Dump; + + thiz->DisableAcceleration = IDirectFBSurface_Dispatcher_DisableAcceleration; + + thiz->ReleaseSource = IDirectFBSurface_Dispatcher_ReleaseSource; + + thiz->SetIndexTranslation = IDirectFBSurface_Dispatcher_SetIndexTranslation; + + return DFB_OK; +} + -- cgit