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/idirectfbfont_dispatcher.c | 532 +++++++++++++++++++++ 1 file changed, 532 insertions(+) create mode 100755 Source/DirectFB/proxy/dispatcher/idirectfbfont_dispatcher.c (limited to 'Source/DirectFB/proxy/dispatcher/idirectfbfont_dispatcher.c') diff --git a/Source/DirectFB/proxy/dispatcher/idirectfbfont_dispatcher.c b/Source/DirectFB/proxy/dispatcher/idirectfbfont_dispatcher.c new file mode 100755 index 0000000..bdb2045 --- /dev/null +++ b/Source/DirectFB/proxy/dispatcher/idirectfbfont_dispatcher.c @@ -0,0 +1,532 @@ +/* + (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 "idirectfbfont_dispatcher.h" + + +static DFBResult Probe( void ); +static DFBResult Construct( IDirectFBFont *thiz, + IDirectFBFont *real, + VoodooManager *manager, + VoodooInstanceID super, + void *arg, + VoodooInstanceID *ret_instance ); + +#include + +DIRECT_INTERFACE_IMPLEMENTATION( IDirectFBFont, Dispatcher ) + + +/**************************************************************************************************/ + +/* + * private data struct of IDirectFBFont_Dispatcher + */ +typedef struct { + int ref; /* reference counter */ + + IDirectFBFont *real; + + VoodooInstanceID self; +} IDirectFBFont_Dispatcher_data; + +/**************************************************************************************************/ + +static void +IDirectFBFont_Dispatcher_Destruct( IDirectFBFont *thiz ) +{ + IDirectFBFont_Dispatcher_data *data = thiz->priv; + + D_DEBUG( "%s (%p)\n", __FUNCTION__, thiz ); + + data->real->Release( data->real ); + + DIRECT_DEALLOCATE_INTERFACE( thiz ); +} + +/**************************************************************************************************/ + +static DirectResult +IDirectFBFont_Dispatcher_AddRef( IDirectFBFont *thiz ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + data->ref++; + + return DFB_OK; +} + +static DirectResult +IDirectFBFont_Dispatcher_Release( IDirectFBFont *thiz ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + if (--data->ref == 0) + IDirectFBFont_Dispatcher_Destruct( thiz ); + + return DFB_OK; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetAscender( IDirectFBFont *thiz, int *ascender ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetDescender( IDirectFBFont *thiz, int *descender ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + if (!descender) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetHeight( IDirectFBFont *thiz, int *height ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + if (!height) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetMaxAdvance( IDirectFBFont *thiz, int *maxadvance ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + if (!maxadvance) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetKerning( IDirectFBFont *thiz, + unsigned int prev_index, unsigned int current_index, + int *kern_x, int *kern_y) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + if (!kern_x && !kern_y) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetStringExtents( IDirectFBFont *thiz, + const char *text, int bytes, + DFBRectangle *logical_rect, + DFBRectangle *ink_rect ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + if (!text || (!logical_rect && !ink_rect)) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetStringWidth( IDirectFBFont *thiz, + const char *text, int bytes, + int *width ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + if (!text || !width) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetGlyphExtents( IDirectFBFont *thiz, + unsigned int index, + DFBRectangle *rect, + int *advance ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + if (!rect && !advance) + return DFB_INVARG; + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_GetStringBreak( IDirectFBFont *thiz, + const char *text, + int bytes, + int max_width, + int *ret_width, + int *ret_str_length, + const char **ret_next_line ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_SetEncoding( IDirectFBFont *thiz, + DFBTextEncodingID encoding ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_EnumEncodings( IDirectFBFont *thiz, + DFBTextEncodingCallback callback, + void *ctx ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +static DFBResult +IDirectFBFont_Dispatcher_FindEncoding( IDirectFBFont *thiz, + const char *name, + DFBTextEncodingID *encoding ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + return DFB_UNIMPLEMENTED; +} + +/**************************************************************************************************/ + +static DirectResult +Dispatch_Release( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + return voodoo_manager_unregister_local( manager, data->self ); +} + +static DirectResult +Dispatch_GetAscender( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + int ascender; + + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + ret = real->GetAscender( real, &ascender ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_INT, ascender, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetDescender( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + int descender; + + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + ret = real->GetDescender( real, &descender ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_INT, descender, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetHeight( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + int height; + + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + ret = real->GetHeight( real, &height ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_INT, height, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetMaxAdvance( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + int max_advance; + + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + ret = real->GetMaxAdvance( real, &max_advance ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_INT, max_advance, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetKerning( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + unsigned int prev; + unsigned int next; + int kern_x; + int kern_y; + + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, prev ); + VOODOO_PARSER_GET_UINT( parser, next ); + VOODOO_PARSER_END( parser ); + + ret = real->GetKerning( real, prev, next, &kern_x, &kern_y ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_INT, kern_x, + VMBT_INT, kern_y, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetStringWidth( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + const char *text; + int bytes; + int width; + + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, text ); + VOODOO_PARSER_GET_INT( parser, bytes ); + VOODOO_PARSER_END( parser ); + + ret = real->GetStringWidth( real, text, bytes, &width ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_INT, width, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetStringExtents( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + const char *text; + int bytes; + DFBRectangle logical; + DFBRectangle ink; + + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_DATA( parser, text ); + VOODOO_PARSER_GET_INT( parser, bytes ); + VOODOO_PARSER_END( parser ); + + ret = real->GetStringExtents( real, text, bytes, &logical, &ink ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_DATA, sizeof(DFBRectangle), &logical, + VMBT_DATA, sizeof(DFBRectangle), &ink, + VMBT_NONE ); +} + +static DirectResult +Dispatch_GetGlyphExtents( IDirectFBFont *thiz, IDirectFBFont *real, + VoodooManager *manager, VoodooRequestMessage *msg ) +{ + DirectResult ret; + VoodooMessageParser parser; + unsigned int index; + DFBRectangle extents; + int advance; + + DIRECT_INTERFACE_GET_DATA(IDirectFBFont_Dispatcher) + + VOODOO_PARSER_BEGIN( parser, msg ); + VOODOO_PARSER_GET_UINT( parser, index ); + VOODOO_PARSER_END( parser ); + + ret = real->GetGlyphExtents( real, index, &extents, &advance ); + if (ret) + return ret; + + return voodoo_manager_respond( manager, true, msg->header.serial, + DFB_OK, VOODOO_INSTANCE_NONE, + VMBT_DATA, sizeof(extents), &extents, + VMBT_INT, advance, + VMBT_NONE ); +} + +static DirectResult +Dispatch( void *dispatcher, void *real, VoodooManager *manager, VoodooRequestMessage *msg ) +{ + D_DEBUG( "IDirectFBFont/Dispatcher: " + "Handling request for instance %u with method %u...\n", msg->instance, msg->method ); + + switch (msg->method) { + case IDIRECTFBFONT_METHOD_ID_Release: + return Dispatch_Release( dispatcher, real, manager, msg ); + + case IDIRECTFBFONT_METHOD_ID_GetAscender: + return Dispatch_GetAscender( dispatcher, real, manager, msg ); + + case IDIRECTFBFONT_METHOD_ID_GetDescender: + return Dispatch_GetDescender( dispatcher, real, manager, msg ); + + case IDIRECTFBFONT_METHOD_ID_GetHeight: + return Dispatch_GetHeight( dispatcher, real, manager, msg ); + + case IDIRECTFBFONT_METHOD_ID_GetMaxAdvance: + return Dispatch_GetMaxAdvance( dispatcher, real, manager, msg ); + + case IDIRECTFBFONT_METHOD_ID_GetKerning: + return Dispatch_GetKerning( dispatcher, real, manager, msg ); + + case IDIRECTFBFONT_METHOD_ID_GetStringWidth: + return Dispatch_GetStringWidth( dispatcher, real, manager, msg ); + + case IDIRECTFBFONT_METHOD_ID_GetStringExtents: + return Dispatch_GetStringExtents( dispatcher, real, manager, msg ); + + case IDIRECTFBFONT_METHOD_ID_GetGlyphExtents: + return Dispatch_GetGlyphExtents( dispatcher, real, manager, msg ); + } + + return DFB_NOSUCHMETHOD; +} + +/**************************************************************************************************/ + +static DFBResult +Probe() +{ + /* This implementation has to be loaded explicitly. */ + return DFB_UNSUPPORTED; +} + +static DFBResult +Construct( IDirectFBFont *thiz, + IDirectFBFont *real, + VoodooManager *manager, + VoodooInstanceID super, + void *arg, /* Optional arguments to constructor */ + VoodooInstanceID *ret_instance ) +{ + DFBResult ret; + + DIRECT_ALLOCATE_INTERFACE_DATA(thiz, IDirectFBFont_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->self = *ret_instance; + + thiz->AddRef = IDirectFBFont_Dispatcher_AddRef; + thiz->Release = IDirectFBFont_Dispatcher_Release; + thiz->GetAscender = IDirectFBFont_Dispatcher_GetAscender; + thiz->GetDescender = IDirectFBFont_Dispatcher_GetDescender; + thiz->GetHeight = IDirectFBFont_Dispatcher_GetHeight; + thiz->GetMaxAdvance = IDirectFBFont_Dispatcher_GetMaxAdvance; + thiz->GetKerning = IDirectFBFont_Dispatcher_GetKerning; + thiz->GetStringWidth = IDirectFBFont_Dispatcher_GetStringWidth; + thiz->GetStringExtents = IDirectFBFont_Dispatcher_GetStringExtents; + thiz->GetGlyphExtents = IDirectFBFont_Dispatcher_GetGlyphExtents; + thiz->GetStringBreak = IDirectFBFont_Dispatcher_GetStringBreak; + thiz->SetEncoding = IDirectFBFont_Dispatcher_SetEncoding; + thiz->EnumEncodings = IDirectFBFont_Dispatcher_EnumEncodings; + thiz->FindEncoding = IDirectFBFont_Dispatcher_FindEncoding; + + return DFB_OK; +} + -- cgit