os/graphics/graphicscomposition/openwfcompositionengine/composition/src/wfcdevice.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/* Copyright (c) 2009-2010 The Khronos Group Inc.
sl@0
     2
 * Portions copyright (c) 2009-2010  Nokia Corporation and/or its subsidiary(-ies)
sl@0
     3
 *
sl@0
     4
 * Permission is hereby granted, free of charge, to any person obtaining a
sl@0
     5
 * copy of this software and/or associated documentation files (the
sl@0
     6
 * "Materials"), to deal in the Materials without restriction, including
sl@0
     7
 * without limitation the rights to use, copy, modify, merge, publish,
sl@0
     8
 * distribute, sublicense, and/or sell copies of the Materials, and to
sl@0
     9
 * permit persons to whom the Materials are furnished to do so, subject to
sl@0
    10
 * the following conditions:
sl@0
    11
 *
sl@0
    12
 * The above copyright notice and this permission notice shall be included
sl@0
    13
 * in all copies or substantial portions of the Materials.
sl@0
    14
 *
sl@0
    15
 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
sl@0
    16
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
sl@0
    17
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
sl@0
    18
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
sl@0
    19
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
sl@0
    20
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
sl@0
    21
 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
sl@0
    22
 */
sl@0
    23
/*! \ingroup wfc
sl@0
    24
 *  \file wfcdevice.c
sl@0
    25
 *
sl@0
    26
 *  \brief SI Device handling
sl@0
    27
 */
sl@0
    28
sl@0
    29
sl@0
    30
#include <stdio.h>
sl@0
    31
#include <string.h>
sl@0
    32
#include <stdlib.h>
sl@0
    33
sl@0
    34
#include "wfcdevice.h"
sl@0
    35
#include "wfcelement.h"
sl@0
    36
#include "wfccontext.h"
sl@0
    37
#include "wfcimageprovider.h"
sl@0
    38
sl@0
    39
#include "owfarray.h"
sl@0
    40
#include "owfmemory.h"
sl@0
    41
#include "owfmutex.h"
sl@0
    42
#include "owfscreen.h"
sl@0
    43
#include "owftypes.h"
sl@0
    44
#include "owfobject.h"
sl@0
    45
#include "owfnativestream.h"
sl@0
    46
#include "owfnotifications.h"
sl@0
    47
#include "owfdebug.h"
sl@0
    48
sl@0
    49
#ifdef __cplusplus
sl@0
    50
extern "C" {
sl@0
    51
#endif
sl@0
    52
sl@0
    53
#define MAX_ATTRIBUTES      32
sl@0
    54
sl@0
    55
#define FAIL_IF(c,e)        if (c) { LEAVE(0); return e; }
sl@0
    56
sl@0
    57
#define FIRST_DEVICE_HANDLE 1000
sl@0
    58
sl@0
    59
PHYSICAL_DEVICE gPhyDevice;
sl@0
    60
sl@0
    61
sl@0
    62
/*-------------------------------------------------------------------------*//*!
sl@0
    63
 *  \internal
sl@0
    64
 *
sl@0
    65
 *  Initialize devices with default parameters.
sl@0
    66
 *//*-------------------------------------------------------------------------*/
sl@0
    67
OWF_API_CALL void
sl@0
    68
WFC_Devices_Initialize()
sl@0
    69
{
sl@0
    70
    static WFCboolean initialised=WFC_FALSE;
sl@0
    71
    if (!initialised)
sl@0
    72
    {
sl@0
    73
        OWF_Array_Initialize(&(gPhyDevice.iDeviceInstanceArray));
sl@0
    74
        gPhyDevice.gDeviceHandleID = 0;
sl@0
    75
        initialised=WFC_TRUE;
sl@0
    76
    }
sl@0
    77
}
sl@0
    78
sl@0
    79
/*---------------------------------------------------------------------------
sl@0
    80
 *
sl@0
    81
 *
sl@0
    82
 *----------------------------------------------------------------------------*/
sl@0
    83
OWF_API_CALL WFCint
sl@0
    84
WFC_Devices_GetIds(WFCint* idList,
sl@0
    85
                   WFCint listCapacity,
sl@0
    86
                   const WFCint* filterList)
sl@0
    87
{
sl@0
    88
sl@0
    89
/* We assume there is only one physical device and
sl@0
    90
 * all screens are supported by this device */
sl@0
    91
sl@0
    92
    WFCint                  screenNumber = OWF_RESERVED_BAD_SCREEN_NUMBER,
sl@0
    93
                            n = MAX_ATTRIBUTES,
sl@0
    94
                            i = 0;
sl@0
    95
    WFCboolean              hasFilter;
sl@0
    96
sl@0
    97
    hasFilter = (filterList && (*filterList != WFC_NONE)) ?
sl@0
    98
                WFC_TRUE :
sl@0
    99
                WFC_FALSE;
sl@0
   100
sl@0
   101
    /* handle filter list, if given */
sl@0
   102
    if (hasFilter)
sl@0
   103
    {
sl@0
   104
        /* scan filter list (up to 32 attributes) */
sl@0
   105
        while (n > 0 && WFC_NONE != filterList[0])
sl@0
   106
        {
sl@0
   107
            switch (filterList[0])
sl@0
   108
            {
sl@0
   109
                case WFC_DEVICE_FILTER_SCREEN_NUMBER:
sl@0
   110
                    if (screenNumber!=OWF_RESERVED_BAD_SCREEN_NUMBER && screenNumber!=filterList[1])
sl@0
   111
                         {
sl@0
   112
                         /* invalid repeated filter on screen number */
sl@0
   113
                          return 0;
sl@0
   114
                         }
sl@0
   115
                    screenNumber = filterList[1];
sl@0
   116
                    if (!OWF_Screen_Valid(screenNumber))
sl@0
   117
                    {
sl@0
   118
                        /* invalid screen number */
sl@0
   119
                        return 0;
sl@0
   120
                    }
sl@0
   121
                    break;
sl@0
   122
sl@0
   123
                case WFC_NONE:
sl@0
   124
                    n = 0;
sl@0
   125
                    break;
sl@0
   126
sl@0
   127
                default:
sl@0
   128
                    /* EARLY EXIT - invalid attribute */
sl@0
   129
                    return 0;
sl@0
   130
            }
sl@0
   131
sl@0
   132
            /* Move pointer to next key-value pair */
sl@0
   133
            filterList += 2;
sl@0
   134
            n--;
sl@0
   135
        }
sl@0
   136
    }
sl@0
   137
sl@0
   138
    /* Return number of available devices */
sl@0
   139
    if (NULL == idList && !hasFilter) {
sl@0
   140
        return 1;
sl@0
   141
    }
sl@0
   142
sl@0
   143
    for (i = 0, n = 0; i < 1 && listCapacity >= 0; i++) {
sl@0
   144
        /* idList might be NULL when querying all devices w/
sl@0
   145
         * screen number in filter list */
sl@0
   146
        if (idList && n < listCapacity)
sl@0
   147
        {
sl@0
   148
            idList[n] = OWF_SUPPORTED_DEVICE_ID;
sl@0
   149
        }
sl@0
   150
sl@0
   151
        n++;
sl@0
   152
    }
sl@0
   153
sl@0
   154
    return n;
sl@0
   155
}
sl@0
   156
sl@0
   157
sl@0
   158
/*---------------------------------------------------------------------------
sl@0
   159
 *  Create instance of a device whose ID
sl@0
   160
 *  matches deviceId
sl@0
   161
 *
sl@0
   162
 *  \param deviceId ID of the device to create. Must be WFC_DEFAULT_DEVICE_ID
sl@0
   163
 *  or some other valid device ID (returned by Devices_GetIds)
sl@0
   164
 *
sl@0
   165
 *  \return Handle to created device or WFC_INVALID_HANDLE
sl@0
   166
 *
sl@0
   167
 *----------------------------------------------------------------------------*/
sl@0
   168
OWF_API_CALL WFCint
sl@0
   169
WFC_Device_Create(WFCint deviceId)
sl@0
   170
{
sl@0
   171
	WFC_DEVICE *dev = NULL;
sl@0
   172
	
sl@0
   173
    ENTER(WFC_Device_Create);
sl@0
   174
    
sl@0
   175
    WFC_Devices_Initialize();
sl@0
   176
sl@0
   177
    if (deviceId != WFC_DEFAULT_DEVICE_ID && deviceId != OWF_SUPPORTED_DEVICE_ID)
sl@0
   178
    {
sl@0
   179
        return WFC_INVALID_HANDLE;
sl@0
   180
    }
sl@0
   181
    
sl@0
   182
    dev = DEVICE(xalloc(1,sizeof(WFC_DEVICE)));
sl@0
   183
    if (dev == NULL)
sl@0
   184
    {
sl@0
   185
    	return WFC_INVALID_HANDLE;
sl@0
   186
    }
sl@0
   187
    
sl@0
   188
    dev->handle = FIRST_DEVICE_HANDLE + (gPhyDevice.gDeviceHandleID)++;
sl@0
   189
    dev->deviceId = deviceId;
sl@0
   190
    dev->latestUnreadError = WFC_ERROR_NONE;
sl@0
   191
    dev->mutex = NULL;
sl@0
   192
    OWF_Array_Initialize(&dev->contexts);
sl@0
   193
    OWF_Array_Initialize(&dev->providers);
sl@0
   194
    OWF_Array_Initialize(&dev->elements);
sl@0
   195
sl@0
   196
    if (!OWF_Array_AppendItem(&(gPhyDevice.iDeviceInstanceArray), dev))
sl@0
   197
        {
sl@0
   198
        xfree(dev);
sl@0
   199
        return WFC_INVALID_HANDLE;
sl@0
   200
        }
sl@0
   201
sl@0
   202
    LEAVE(WFC_Device_Create);
sl@0
   203
sl@0
   204
    return dev->handle;
sl@0
   205
}
sl@0
   206
sl@0
   207
/*---------------------------------------------------------------------------
sl@0
   208
 *  Set error code for device. Obs! In case the previous
sl@0
   209
 *  error code hasn't been read from the device, this function
sl@0
   210
 *  does nothing; the new error is set only if "current" error
sl@0
   211
 *  is none.
sl@0
   212
 *
sl@0
   213
 *  \param dev Device object
sl@0
   214
 *  \param code Error to set
sl@0
   215
 *
sl@0
   216
 *----------------------------------------------------------------------------*/
sl@0
   217
OWF_API_CALL void OWF_APIENTRY
sl@0
   218
WFC_Device_SetError(WFCDevice dev,
sl@0
   219
                    WFCErrorCode code)
sl@0
   220
{
sl@0
   221
#ifdef DEBUG_LOG
sl@0
   222
    static char* const      errmsg[] =
sl@0
   223
                            {
sl@0
   224
                            "WFC_ERROR_NONE",
sl@0
   225
                            "WFC_ERROR_OUT_OF_MEMORY",
sl@0
   226
                            "WFC_ERROR_ILLEGAL_ARGUMENT",
sl@0
   227
                            "WFC_ERROR_UNSUPPORTED",
sl@0
   228
                            "WFC_ERROR_BAD_ATTRIBUTE",
sl@0
   229
                            "WFC_ERROR_IN_USE",
sl@0
   230
                            "WFC_ERROR_BUSY",
sl@0
   231
                            "WFC_ERROR_BAD_DEVICE",
sl@0
   232
                            "WFC_ERROR_BAD_HANDLE",
sl@0
   233
                            "WFC_ERROR_INCONSISTENCY",
sl@0
   234
                            };
sl@0
   235
#endif
sl@0
   236
    
sl@0
   237
    WFC_DEVICE* device = WFC_Device_FindByHandle(dev);
sl@0
   238
    if (WFC_INVALID_HANDLE == device)
sl@0
   239
    {
sl@0
   240
        /* Invalid device handle. Nothing we can do about it so return. */
sl@0
   241
        return;
sl@0
   242
    }
sl@0
   243
sl@0
   244
    if (!device->mutex)
sl@0
   245
    {
sl@0
   246
        OWF_Mutex_Init(&device->mutex);
sl@0
   247
    }
sl@0
   248
sl@0
   249
    OWF_Mutex_Lock(&device->mutex);
sl@0
   250
    if (code == WFC_ERROR_IN_USE)
sl@0
   251
        {
sl@0
   252
        code=WFC_ERROR_IN_USE;
sl@0
   253
        }
sl@0
   254
    if (WFC_INVALID_HANDLE != device) {
sl@0
   255
        if (WFC_ERROR_NONE == device->latestUnreadError &&
sl@0
   256
            code != device->latestUnreadError)
sl@0
   257
        {
sl@0
   258
#ifdef DEBUG_LOG
sl@0
   259
             char* const msg = errmsg[code > WFC_ERROR_NONE ?
sl@0
   260
                    code - WFC_ERROR_OUT_OF_MEMORY + 1 : 0];
sl@0
   261
             (void)msg; //always reference to avoid warning
sl@0
   262
#endif
sl@0
   263
sl@0
   264
            DPRINT(("setError(dev = %08x, err = %08x)", dev, code));
sl@0
   265
            DPRINT(("  error set to = %04x (%s)", (OWFuint16) code, msg));
sl@0
   266
sl@0
   267
            device->latestUnreadError = code;
sl@0
   268
        }
sl@0
   269
    }
sl@0
   270
sl@0
   271
    OWF_Mutex_Unlock(&device->mutex);
sl@0
   272
}
sl@0
   273
sl@0
   274
/*---------------------------------------------------------------------------
sl@0
   275
 *  Read and reset last error code from device.
sl@0
   276
 *
sl@0
   277
 *  \param device Device object
sl@0
   278
 *
sl@0
   279
 *  \return WFCErrorCode
sl@0
   280
 *----------------------------------------------------------------------------*/
sl@0
   281
OWF_API_CALL WFCErrorCode
sl@0
   282
WFC_Device_GetError(WFC_DEVICE* device)
sl@0
   283
{
sl@0
   284
    WFCErrorCode            err;
sl@0
   285
sl@0
   286
    OWF_ASSERT(device);
sl@0
   287
sl@0
   288
    err = device->latestUnreadError;
sl@0
   289
    device->latestUnreadError = WFC_ERROR_NONE;
sl@0
   290
    return err;
sl@0
   291
}
sl@0
   292
sl@0
   293
/*---------------------------------------------------------------------------
sl@0
   294
 *  Find device object by handle
sl@0
   295
 *
sl@0
   296
 *  \param dev Device handle
sl@0
   297
 *
sl@0
   298
 *  \return Matching device object or NULL
sl@0
   299
 *----------------------------------------------------------------------------*/
sl@0
   300
OWF_API_CALL WFC_DEVICE*
sl@0
   301
WFC_Device_FindByHandle(WFCDevice dev)
sl@0
   302
{
sl@0
   303
    WFCint i = 0, length = 0;
sl@0
   304
    WFC_DEVICE* pDevice = NULL;
sl@0
   305
    
sl@0
   306
    if (dev == WFC_INVALID_HANDLE)
sl@0
   307
    {
sl@0
   308
        return NULL;
sl@0
   309
    }
sl@0
   310
    
sl@0
   311
    WFC_Devices_Initialize();
sl@0
   312
    
sl@0
   313
    length = gPhyDevice.iDeviceInstanceArray.length;
sl@0
   314
    for (i = 0; i < length; ++i)
sl@0
   315
        {
sl@0
   316
        pDevice = DEVICE(OWF_Array_GetItemAt(&(gPhyDevice.iDeviceInstanceArray), i));
sl@0
   317
        if (pDevice->handle == dev)
sl@0
   318
            {
sl@0
   319
            return pDevice;
sl@0
   320
            }
sl@0
   321
        }
sl@0
   322
    return NULL;
sl@0
   323
}
sl@0
   324
sl@0
   325
/*---------------------------------------------------------------------------
sl@0
   326
 *  Get device attribute
sl@0
   327
 *
sl@0
   328
 *  \param device Device
sl@0
   329
 *  \param attrib Attribute name
sl@0
   330
 *  \param value Pointer to where the value should be saved
sl@0
   331
 *
sl@0
   332
 *  \return WFCErrorCode
sl@0
   333
 *----------------------------------------------------------------------------*/
sl@0
   334
OWF_API_CALL WFCErrorCode
sl@0
   335
WFC_Device_GetAttribi(WFC_DEVICE* device,
sl@0
   336
                      WFCDeviceAttrib attrib,
sl@0
   337
                      WFCint* value)
sl@0
   338
{
sl@0
   339
    WFCErrorCode            result = WFC_ERROR_NONE;
sl@0
   340
sl@0
   341
    OWF_ASSERT(device);
sl@0
   342
sl@0
   343
    switch (attrib)
sl@0
   344
    {
sl@0
   345
        case WFC_DEVICE_CLASS:
sl@0
   346
        {
sl@0
   347
            *value = WFC_DEVICE_CLASS_FULLY_CAPABLE;
sl@0
   348
            break;
sl@0
   349
        }
sl@0
   350
        case WFC_DEVICE_ID:
sl@0
   351
        {
sl@0
   352
            *value = device->deviceId;
sl@0
   353
            break;
sl@0
   354
        }
sl@0
   355
        default:
sl@0
   356
        {
sl@0
   357
            result = WFC_ERROR_BAD_ATTRIBUTE;
sl@0
   358
        }
sl@0
   359
    }
sl@0
   360
    return result;
sl@0
   361
}
sl@0
   362
sl@0
   363
/*[][][][] CONTEXTS  [][][][][][][][][][][][][][][][][][][][][][][][][][][][]*/
sl@0
   364
sl@0
   365
/*---------------------------------------------------------------------------
sl@0
   366
 *  Create context on device
sl@0
   367
 *
sl@0
   368
 *  \param device Device
sl@0
   369
 *  \param stream Target stream for context
sl@0
   370
 *  \param type Context type
sl@0
   371
 *
sl@0
   372
 *  \return New context
sl@0
   373
 *----------------------------------------------------------------------------*/
sl@0
   374
OWF_API_CALL WFC_CONTEXT*
sl@0
   375
WFC_Device_CreateContext(WFC_DEVICE* device,
sl@0
   376
                         OWFNativeStreamType stream,
sl@0
   377
                         WFCContextType type,
sl@0
   378
                         WFCint screenNum)
sl@0
   379
{
sl@0
   380
    WFC_CONTEXT*            context;
sl@0
   381
sl@0
   382
    ENTER(WFC_Device_CreateContext);
sl@0
   383
sl@0
   384
    OWF_ASSERT(device);
sl@0
   385
sl@0
   386
    context = WFC_Context_Create(device, stream, type, screenNum);
sl@0
   387
    if (context)
sl@0
   388
    {
sl@0
   389
        if (!OWF_Array_AppendItem(&device->contexts, context))
sl@0
   390
        {
sl@0
   391
            DESTROY(context);
sl@0
   392
        }
sl@0
   393
    }
sl@0
   394
    LEAVE(WFC_Device_CreateContext);
sl@0
   395
sl@0
   396
    return context;
sl@0
   397
}
sl@0
   398
sl@0
   399
/*---------------------------------------------------------------------------
sl@0
   400
 *  Destroy context from device
sl@0
   401
 *----------------------------------------------------------------------------*/
sl@0
   402
OWF_API_CALL WFCErrorCode
sl@0
   403
WFC_Device_DestroyContext(WFC_DEVICE* device,
sl@0
   404
                          WFCContext context)
sl@0
   405
{
sl@0
   406
    WFCint                  i;
sl@0
   407
    WFCErrorCode            result = WFC_ERROR_BAD_HANDLE;
sl@0
   408
    ENTER(WFC_Device_DestroyContext);
sl@0
   409
sl@0
   410
    OWF_ASSERT(device);
sl@0
   411
sl@0
   412
    DPRINT(("WFC_Device_DestroyContext(context = %d)", context));
sl@0
   413
sl@0
   414
    for (i = 0; i < device->contexts.length; i++)
sl@0
   415
    {
sl@0
   416
        WFC_CONTEXT*        ctmp;
sl@0
   417
sl@0
   418
        ctmp = (WFC_CONTEXT*) OWF_Array_GetItemAt(&device->contexts, i);
sl@0
   419
        if (ctmp->handle == context)
sl@0
   420
        {
sl@0
   421
            WFC_CONTEXT*    context;
sl@0
   422
sl@0
   423
            context = CONTEXT(OWF_Array_RemoveItemAt(&device->contexts, i));
sl@0
   424
            DPRINT(("  Shutting down context %d", context->handle));
sl@0
   425
            WFC_Context_Shutdown(context);
sl@0
   426
            DESTROY(context);
sl@0
   427
            result = WFC_ERROR_NONE;
sl@0
   428
            break;
sl@0
   429
        }
sl@0
   430
    }
sl@0
   431
sl@0
   432
    DPRINT((""));
sl@0
   433
sl@0
   434
    DPRINT(("-------------------------------------------------------"));
sl@0
   435
    DPRINT(("Device statistics after context destruction:"));
sl@0
   436
    DPRINT(("  Contexts: %d", device->contexts.length));
sl@0
   437
    DPRINT(("  Elements: %d", device->elements.length));
sl@0
   438
    DPRINT(("  Image providers: %d", device->providers.length));
sl@0
   439
     DPRINT(("-------------------------------------------------------"));
sl@0
   440
    LEAVE(WFC_Device_DestroyContext);
sl@0
   441
sl@0
   442
    return result;
sl@0
   443
}
sl@0
   444
sl@0
   445
/*---------------------------------------------------------------------------
sl@0
   446
 *  Destroy all device's contexts
sl@0
   447
 *
sl@0
   448
 *  \param device Device object
sl@0
   449
 *----------------------------------------------------------------------------*/
sl@0
   450
OWF_API_CALL void
sl@0
   451
WFC_Device_DestroyContexts(WFC_DEVICE* device)
sl@0
   452
{
sl@0
   453
    WFCint                  i;
sl@0
   454
sl@0
   455
    ENTER(WFC_Device_DestroyContexts);
sl@0
   456
sl@0
   457
    for (i = 0; i < device->contexts.length; i++)
sl@0
   458
    {
sl@0
   459
        WFC_CONTEXT*        context;
sl@0
   460
sl@0
   461
        context = CONTEXT(OWF_Array_GetItemAt(&device->contexts, i));
sl@0
   462
        WFC_Context_Shutdown(context);
sl@0
   463
sl@0
   464
        DESTROY(context);
sl@0
   465
    }
sl@0
   466
    OWF_Array_Destroy(&device->contexts);
sl@0
   467
sl@0
   468
    LEAVE(WFC_Device_DestroyContexts);
sl@0
   469
}
sl@0
   470
sl@0
   471
/*---------------------------------------------------------------------------
sl@0
   472
 *  Find context context object by handle
sl@0
   473
 *
sl@0
   474
 *  \param device Device
sl@0
   475
 *  \param context Context handle
sl@0
   476
 *
sl@0
   477
 *  \return Corresponding context object or NULL
sl@0
   478
 *  if handle is invalid.
sl@0
   479
 *----------------------------------------------------------------------------*/
sl@0
   480
OWF_API_CALL WFC_CONTEXT*
sl@0
   481
WFC_Device_FindContext(WFC_DEVICE* device,
sl@0
   482
                       WFCContext context)
sl@0
   483
{
sl@0
   484
    WFCint                  i;
sl@0
   485
    WFC_CONTEXT*            result = NULL;
sl@0
   486
sl@0
   487
    ENTER(WFC_Device_FindContext);
sl@0
   488
sl@0
   489
    FAIL_IF(NULL == device, NULL);
sl@0
   490
sl@0
   491
    for (i = 0; i < device->contexts.length; i++)
sl@0
   492
    {
sl@0
   493
        WFC_CONTEXT*        ctmp;
sl@0
   494
sl@0
   495
        ctmp = CONTEXT(OWF_Array_GetItemAt(&device->contexts, i));
sl@0
   496
        if (ctmp->handle == context)
sl@0
   497
        {
sl@0
   498
            result = ctmp;
sl@0
   499
            break;
sl@0
   500
        }
sl@0
   501
    }
sl@0
   502
    LEAVE(WFC_Device_FindContext);
sl@0
   503
sl@0
   504
    return result;
sl@0
   505
}
sl@0
   506
/*[][][][] ELEMENTS  [][][][][][][][][][][][][][][][][][][][][][][][][][][][]*/
sl@0
   507
sl@0
   508
/*---------------------------------------------------------------------------
sl@0
   509
 *  Create new element
sl@0
   510
 *
sl@0
   511
 *  \param device
sl@0
   512
 *  \param context
sl@0
   513
 *
sl@0
   514
 *  \return New element or NULL
sl@0
   515
 *----------------------------------------------------------------------------*/
sl@0
   516
OWF_API_CALL WFC_ELEMENT*
sl@0
   517
WFC_Device_CreateElement(WFC_DEVICE* device, WFC_CONTEXT* context)
sl@0
   518
{
sl@0
   519
    WFC_ELEMENT*        element=NULL;
sl@0
   520
sl@0
   521
    ENTER(WFC_Device_CreateElement);
sl@0
   522
sl@0
   523
    FAIL_IF(NULL == device || NULL == context, NULL);
sl@0
   524
    if (WFC_Context_IncreaseClientElementCount(context)>0)
sl@0
   525
    {
sl@0
   526
        element = WFC_Element_Create(context);
sl@0
   527
        if (!element || !OWF_Array_AppendItem(&device->elements, element))
sl@0
   528
        {
sl@0
   529
            DPRINT(("WFC_Device_CreateElement: couldn't create element"));
sl@0
   530
            WFC_Context_DecreaseClientElementCount(context);
sl@0
   531
            if (element)
sl@0
   532
                {
sl@0
   533
                WFC_Element_Destroy(element);
sl@0
   534
                }
sl@0
   535
            element = NULL;
sl@0
   536
        }
sl@0
   537
        else
sl@0
   538
        {
sl@0
   539
            /* #4585: statement moved to else block */
sl@0
   540
            DPRINT(("  Created element; handle = %d", element->handle));
sl@0
   541
        }
sl@0
   542
    }
sl@0
   543
    LEAVE(WFC_Device_CreateElement);
sl@0
   544
sl@0
   545
    return element;
sl@0
   546
}
sl@0
   547
sl@0
   548
/*---------------------------------------------------------------------------
sl@0
   549
 *  Destroy element
sl@0
   550
 *
sl@0
   551
 *  \param device
sl@0
   552
 *  \param element
sl@0
   553
 *----------------------------------------------------------------------------*/
sl@0
   554
OWF_API_CALL WFCErrorCode
sl@0
   555
WFC_Device_DestroyElement(WFC_DEVICE* device,
sl@0
   556
                          WFCElement element)
sl@0
   557
{
sl@0
   558
    WFCint                  i;
sl@0
   559
    WFCErrorCode            result = WFC_ERROR_BAD_HANDLE;
sl@0
   560
sl@0
   561
    ENTER(WFC_Device_DestroyElement);
sl@0
   562
sl@0
   563
    FAIL_IF(NULL == device, WFC_ERROR_BAD_HANDLE);
sl@0
   564
    DPRINT(("destroying element %d", element));
sl@0
   565
sl@0
   566
    for (i = 0; i < device->elements.length; i++)
sl@0
   567
    {
sl@0
   568
        WFC_ELEMENT*        object;
sl@0
   569
sl@0
   570
        object = ELEMENT(OWF_Array_GetItemAt(&device->elements, i));
sl@0
   571
        DPRINT(("  element %d = %d", i, object->handle));
sl@0
   572
        if (object->handle == element)
sl@0
   573
        {
sl@0
   574
            WFC_Context_RemoveElement(CONTEXT(object->context), element);
sl@0
   575
sl@0
   576
            WFC_Context_DecreaseClientElementCount(object->context);
sl@0
   577
            OWF_Array_RemoveItemAt(&device->elements, i);
sl@0
   578
            WFC_Element_Destroy(object);
sl@0
   579
            result = WFC_ERROR_NONE;
sl@0
   580
            break;
sl@0
   581
        }
sl@0
   582
    }
sl@0
   583
    LEAVE(WFC_Device_DestroyElement);
sl@0
   584
    return result;
sl@0
   585
}
sl@0
   586
sl@0
   587
/*---------------------------------------------------------------------------
sl@0
   588
 *  Destroy all elements from device
sl@0
   589
 *
sl@0
   590
 *  \param device Device
sl@0
   591
 *----------------------------------------------------------------------------*/
sl@0
   592
OWF_API_CALL void
sl@0
   593
WFC_Device_DestroyElements(WFC_DEVICE* device)
sl@0
   594
{
sl@0
   595
    WFCint                  i;
sl@0
   596
sl@0
   597
    ENTER(WFC_Device_DestroyElements);
sl@0
   598
sl@0
   599
    OWF_ASSERT(device);
sl@0
   600
sl@0
   601
    for (i = 0; i < device->elements.length; i++)
sl@0
   602
    {
sl@0
   603
        WFC_ELEMENT*        etemp;
sl@0
   604
sl@0
   605
        etemp = ELEMENT(OWF_Array_GetItemAt(&device->elements, i));
sl@0
   606
        WFC_Element_Destroy(etemp);
sl@0
   607
    }
sl@0
   608
    OWF_Array_Destroy(&device->elements);
sl@0
   609
sl@0
   610
    LEAVE(WFC_Device_DestroyElements);
sl@0
   611
}
sl@0
   612
sl@0
   613
/*---------------------------------------------------------------------------
sl@0
   614
 *  Find element by handle
sl@0
   615
 *
sl@0
   616
 *  \param device Device
sl@0
   617
 *  \param el Element handle
sl@0
   618
 *
sl@0
   619
 *  \return Element object
sl@0
   620
 *----------------------------------------------------------------------------*/
sl@0
   621
OWF_API_CALL WFC_ELEMENT*
sl@0
   622
WFC_Device_FindElement(WFC_DEVICE* device,
sl@0
   623
                       WFCElement el)
sl@0
   624
{
sl@0
   625
    WFC_ELEMENT*            result = WFC_INVALID_HANDLE;
sl@0
   626
    WFCint                  i;
sl@0
   627
sl@0
   628
    FAIL_IF(NULL == device, NULL);
sl@0
   629
sl@0
   630
    for (i = 0; i < device->elements.length; i++)
sl@0
   631
    {
sl@0
   632
        WFC_ELEMENT*        element;
sl@0
   633
        element = ELEMENT(OWF_Array_GetItemAt(&device->elements, i));
sl@0
   634
sl@0
   635
        if (element->handle == el)
sl@0
   636
        {
sl@0
   637
            result = element;
sl@0
   638
            break;
sl@0
   639
        }
sl@0
   640
sl@0
   641
    }
sl@0
   642
    return result;
sl@0
   643
}
sl@0
   644
sl@0
   645
/*---------------------------------------------------------------------------
sl@0
   646
 *  Set element integer vector attribute
sl@0
   647
 *
sl@0
   648
 *  \param device Device
sl@0
   649
 *  \param element Element handle
sl@0
   650
 *  \param attrib Attribute name
sl@0
   651
 *  \param count Attribute value vector length (1 for scalar attribute)
sl@0
   652
 *  \param values Pointer to values
sl@0
   653
 *
sl@0
   654
 *  \return WFCErrorCode: WFC_ERROR_BAD_ATTRIBUTE if attribute name is invalid;
sl@0
   655
 *  WFC_ERROR_INVALID_ARGUMENT if values is NULL or if the count doesn't match
sl@0
   656
 *  the attribute's size; WFC_ERROR_BAD_HANDLE if element handle is invalid.
sl@0
   657
 *----------------------------------------------------------------------------*/
sl@0
   658
OWF_API_CALL WFCErrorCode
sl@0
   659
WFC_Device_SetElementAttribiv(WFC_DEVICE* device,
sl@0
   660
                              WFCElement element,
sl@0
   661
                              WFCElementAttrib attrib,
sl@0
   662
                              WFCint count,
sl@0
   663
                              const WFCint* values)
sl@0
   664
{
sl@0
   665
    WFC_ELEMENT*            object;
sl@0
   666
sl@0
   667
    OWF_ASSERT(device);
sl@0
   668
sl@0
   669
    object = WFC_Device_FindElement(device, element);
sl@0
   670
    FAIL_IF(NULL == object, WFC_ERROR_BAD_HANDLE);
sl@0
   671
    return WFC_Element_SetAttribiv(object, attrib, count, values);
sl@0
   672
}
sl@0
   673
sl@0
   674
/*---------------------------------------------------------------------------
sl@0
   675
 *
sl@0
   676
 *
sl@0
   677
 *----------------------------------------------------------------------------*/
sl@0
   678
OWF_API_CALL WFCErrorCode
sl@0
   679
WFC_Device_SetElementAttribfv(WFC_DEVICE* device,
sl@0
   680
                              WFCElement element,
sl@0
   681
                              WFCElementAttrib attrib,
sl@0
   682
                              WFCint count,
sl@0
   683
                              const WFCfloat* values)
sl@0
   684
{
sl@0
   685
    WFC_ELEMENT*            object;
sl@0
   686
sl@0
   687
    OWF_ASSERT(device);
sl@0
   688
sl@0
   689
    object = WFC_Device_FindElement(device, element);
sl@0
   690
    FAIL_IF(NULL == object, WFC_ERROR_BAD_HANDLE);
sl@0
   691
    return WFC_Element_SetAttribfv(object, attrib, count, values);
sl@0
   692
}
sl@0
   693
sl@0
   694
/*---------------------------------------------------------------------------
sl@0
   695
 *
sl@0
   696
 *
sl@0
   697
 *----------------------------------------------------------------------------*/
sl@0
   698
OWF_API_CALL WFCErrorCode
sl@0
   699
WFC_Device_GetElementAttribiv(WFC_DEVICE* device,
sl@0
   700
                              WFCElement element,
sl@0
   701
                              WFCElementAttrib attrib,
sl@0
   702
                              WFCint count,
sl@0
   703
                              WFCint* values)
sl@0
   704
{
sl@0
   705
    WFC_ELEMENT*            object;
sl@0
   706
sl@0
   707
    OWF_ASSERT(device);
sl@0
   708
sl@0
   709
    object = WFC_Device_FindElement(device, element);
sl@0
   710
    FAIL_IF(NULL == object, WFC_ERROR_BAD_HANDLE);
sl@0
   711
    return WFC_Element_GetAttribiv(object, attrib, count, values);
sl@0
   712
}
sl@0
   713
sl@0
   714
/*---------------------------------------------------------------------------
sl@0
   715
 *
sl@0
   716
 *
sl@0
   717
 *----------------------------------------------------------------------------*/
sl@0
   718
OWF_API_CALL WFCErrorCode
sl@0
   719
WFC_Device_GetElementAttribfv(WFC_DEVICE* device,
sl@0
   720
                              WFCElement element,
sl@0
   721
                              WFCElementAttrib attrib,
sl@0
   722
                              WFCint count,
sl@0
   723
                              WFCfloat* values)
sl@0
   724
{
sl@0
   725
    WFC_ELEMENT*            object;
sl@0
   726
sl@0
   727
    OWF_ASSERT(device);
sl@0
   728
sl@0
   729
    object = WFC_Device_FindElement(device, element);
sl@0
   730
    FAIL_IF(NULL == object, WFC_ERROR_BAD_HANDLE);
sl@0
   731
    return WFC_Element_GetAttribfv(object, attrib, count, values);
sl@0
   732
}
sl@0
   733
sl@0
   734
sl@0
   735
/*[][][][] IMAGE PROVIDERS [][][][][][][][][][][][][][][][][][][][][][][][][]*/
sl@0
   736
sl@0
   737
/*---------------------------------------------------------------------------
sl@0
   738
 *
sl@0
   739
 *----------------------------------------------------------------------------*/
sl@0
   740
OWF_API_CALL void
sl@0
   741
WFC_Device_EnableContentNotifications(WFC_DEVICE* device,
sl@0
   742
                                      WFC_CONTEXT* context,
sl@0
   743
                                      WFCboolean enable)
sl@0
   744
{
sl@0
   745
    WFCint                  i;
sl@0
   746
sl@0
   747
    OWF_ASSERT(device);
sl@0
   748
    OWF_ASSERT(context);
sl@0
   749
sl@0
   750
    context = context;
sl@0
   751
sl@0
   752
    for (i = 0; i < device->providers.length; i++)
sl@0
   753
    {
sl@0
   754
        WFC_IMAGE_PROVIDER* prov;
sl@0
   755
sl@0
   756
        prov = IMAGE_PROVIDER(OWF_Array_GetItemAt(&device->providers, i));
sl@0
   757
sl@0
   758
        owfNativeStreamEnableUpdateNotifications(prov->streamHandle,
sl@0
   759
                                                 enable ? OWF_TRUE : OWF_FALSE);
sl@0
   760
    }
sl@0
   761
}
sl@0
   762
sl@0
   763
/*---------------------------------------------------------------------------
sl@0
   764
 *
sl@0
   765
 *----------------------------------------------------------------------------*/
sl@0
   766
static WFC_IMAGE_PROVIDER*
sl@0
   767
WFC_Device_CreateImageProvider(WFC_DEVICE* device,
sl@0
   768
                               WFC_CONTEXT* context,
sl@0
   769
                               OWFNativeStreamType stream,
sl@0
   770
                               WFC_IMAGE_PROVIDER_TYPE type)
sl@0
   771
{
sl@0
   772
    WFC_IMAGE_PROVIDER*         provider;
sl@0
   773
    WFCint						success;
sl@0
   774
sl@0
   775
    OWF_ASSERT(device);
sl@0
   776
    OWF_ASSERT(context);
sl@0
   777
sl@0
   778
    /* create/fetch stream-wrapper for native stream.  */
sl@0
   779
sl@0
   780
    /* create new image provider object associated to
sl@0
   781
     * native stream wrapper previously fetched */
sl@0
   782
    provider = WFC_ImageProvider_Create(context, stream, type);
sl@0
   783
    if (!provider)
sl@0
   784
    {
sl@0
   785
        return NULL;
sl@0
   786
    }   
sl@0
   787
sl@0
   788
    success = OWF_TRUE;
sl@0
   789
    if (OWF_Array_AppendItem(&device->providers, provider) != OWF_TRUE)
sl@0
   790
    {
sl@0
   791
        success = OWF_FALSE;
sl@0
   792
    }
sl@0
   793
sl@0
   794
    if (!success || !owfSymDeviceInitialise(provider))
sl@0
   795
    {
sl@0
   796
        OWF_Array_RemoveItem(&device->providers, provider);
sl@0
   797
        success = OWF_FALSE;
sl@0
   798
    }
sl@0
   799
    if (!success)
sl@0
   800
    {
sl@0
   801
        DESTROY(provider);
sl@0
   802
        provider = NULL;
sl@0
   803
    }
sl@0
   804
    return provider;
sl@0
   805
}
sl@0
   806
sl@0
   807
/*---------------------------------------------------------------------------
sl@0
   808
 *
sl@0
   809
 *----------------------------------------------------------------------------*/
sl@0
   810
static WFCErrorCode
sl@0
   811
WFC_Device_DestroyImageProvider(WFC_DEVICE* device,
sl@0
   812
                                WFCHandle handle)
sl@0
   813
{
sl@0
   814
    WFCint                  i;
sl@0
   815
    WFCErrorCode            result = WFC_ERROR_BAD_HANDLE;
sl@0
   816
sl@0
   817
    ENTER(WFC_Device_DestroyImageProvider);
sl@0
   818
sl@0
   819
    OWF_ASSERT(device);
sl@0
   820
sl@0
   821
    DPRINT(("  number of providers = %d", device->providers.length));
sl@0
   822
sl@0
   823
    for (i = 0; i < device->providers.length; i++)
sl@0
   824
    {
sl@0
   825
        WFC_IMAGE_PROVIDER* object;
sl@0
   826
sl@0
   827
        object = (WFC_IMAGE_PROVIDER*)OWF_Array_GetItemAt(&device->providers, i);
sl@0
   828
		OWF_ASSERT(object);
sl@0
   829
        if (object->handle == handle)
sl@0
   830
        {
sl@0
   831
        
sl@0
   832
            DPRINT(("  Destroying image provider %d", handle));
sl@0
   833
            
sl@0
   834
            owfSymDeviceDestroy(device, object, i);
sl@0
   835
            OWF_Array_RemoveItemAt(&device->providers, i);
sl@0
   836
                        
sl@0
   837
            DESTROY(object);
sl@0
   838
            result = WFC_ERROR_NONE;
sl@0
   839
            break;
sl@0
   840
        }
sl@0
   841
    }
sl@0
   842
sl@0
   843
    /*
sl@0
   844
     *  Image provider's source content observer should be removed here,
sl@0
   845
     *  but on the other hand, it'll be removed when the image provider's
sl@0
   846
     *  source stream gets destroyed.
sl@0
   847
     */
sl@0
   848
    LEAVE(WFC_Device_DestroyImageProvider);
sl@0
   849
    return result;
sl@0
   850
}
sl@0
   851
sl@0
   852
/*---------------------------------------------------------------------------
sl@0
   853
 *  Destroy all image providers from device
sl@0
   854
 *
sl@0
   855
 *  \param device Device
sl@0
   856
 *----------------------------------------------------------------------------*/
sl@0
   857
OWF_API_CALL void
sl@0
   858
WFC_Device_DestroyImageProviders(WFC_DEVICE* device)
sl@0
   859
{
sl@0
   860
    WFCint                  i;
sl@0
   861
sl@0
   862
    ENTER(WFC_Device_DestroyImageProviders);
sl@0
   863
sl@0
   864
    OWF_ASSERT(device);
sl@0
   865
sl@0
   866
    DPRINT(("number of providers = %d", device->providers.length));
sl@0
   867
sl@0
   868
    for (i = 0; i < device->providers.length; i++)
sl@0
   869
    {
sl@0
   870
        WFC_IMAGE_PROVIDER* itemp;
sl@0
   871
sl@0
   872
        itemp = IMAGE_PROVIDER(OWF_Array_GetItemAt(&device->providers, i));
sl@0
   873
        DESTROY(itemp);
sl@0
   874
    }
sl@0
   875
    OWF_Array_Destroy(&device->providers);
sl@0
   876
sl@0
   877
    LEAVE(WFC_Device_DestroyImageProviders);
sl@0
   878
}
sl@0
   879
sl@0
   880
/*---------------------------------------------------------------------------
sl@0
   881
 *
sl@0
   882
 *----------------------------------------------------------------------------*/
sl@0
   883
OWF_API_CALL WFC_IMAGE_PROVIDER*
sl@0
   884
WFC_Device_FindImageProvider(WFC_DEVICE* device,
sl@0
   885
                             WFCHandle handle,
sl@0
   886
                             WFC_IMAGE_PROVIDER_TYPE type)
sl@0
   887
{
sl@0
   888
    WFCint                  i;
sl@0
   889
    WFC_IMAGE_PROVIDER*     result = WFC_INVALID_HANDLE;
sl@0
   890
sl@0
   891
    ENTER(WFC_Device_FindImageProvider);
sl@0
   892
sl@0
   893
    OWF_ASSERT(device);
sl@0
   894
    DPRINT(("number of providers = %d", device->providers.length));
sl@0
   895
sl@0
   896
    for (i = 0; i < device->providers.length; i++)
sl@0
   897
    {
sl@0
   898
        WFC_IMAGE_PROVIDER* object;
sl@0
   899
sl@0
   900
        object = IMAGE_PROVIDER(OWF_Array_GetItemAt(&device->providers, i));
sl@0
   901
        if (object->handle == handle && object->type == type)
sl@0
   902
        {
sl@0
   903
            result = object;
sl@0
   904
            break;
sl@0
   905
        }
sl@0
   906
    }
sl@0
   907
sl@0
   908
    LEAVE(WFC_Device_FindImageProvider);
sl@0
   909
sl@0
   910
    return result;
sl@0
   911
}
sl@0
   912
sl@0
   913
/*---------------------------------------------------------------------------
sl@0
   914
 *
sl@0
   915
 *----------------------------------------------------------------------------*/
sl@0
   916
OWF_API_CALL WFC_IMAGE_PROVIDER*
sl@0
   917
WFC_Device_CreateSource(WFC_DEVICE* device,
sl@0
   918
                        WFC_CONTEXT* context,
sl@0
   919
                        WFCNativeStreamType stream)
sl@0
   920
{
sl@0
   921
    OWF_ASSERT(device);
sl@0
   922
    OWF_ASSERT(context);
sl@0
   923
    return WFC_Device_CreateImageProvider(device,
sl@0
   924
                                          context, stream, WFC_IMAGE_SOURCE);
sl@0
   925
}
sl@0
   926
sl@0
   927
/*---------------------------------------------------------------------------
sl@0
   928
 *
sl@0
   929
 *----------------------------------------------------------------------------*/
sl@0
   930
OWF_API_CALL WFC_IMAGE_PROVIDER*
sl@0
   931
WFC_Device_CreateMask(WFC_DEVICE* device,
sl@0
   932
                      WFC_CONTEXT* context,
sl@0
   933
                      WFCNativeStreamType stream)
sl@0
   934
{
sl@0
   935
    OWF_ASSERT(device);
sl@0
   936
    OWF_ASSERT(context);
sl@0
   937
    return WFC_Device_CreateImageProvider(device,
sl@0
   938
                                          context, stream, WFC_IMAGE_MASK);
sl@0
   939
}
sl@0
   940
sl@0
   941
/*---------------------------------------------------------------------------
sl@0
   942
 *
sl@0
   943
 *----------------------------------------------------------------------------*/
sl@0
   944
OWF_API_CALL WFCErrorCode
sl@0
   945
WFC_Device_DestroySource(WFC_DEVICE* device, WFCSource source)
sl@0
   946
{
sl@0
   947
    OWF_ASSERT(device);
sl@0
   948
    return WFC_Device_DestroyImageProvider(device, source);
sl@0
   949
}
sl@0
   950
sl@0
   951
/*---------------------------------------------------------------------------
sl@0
   952
 *
sl@0
   953
 *----------------------------------------------------------------------------*/
sl@0
   954
OWF_API_CALL WFCErrorCode
sl@0
   955
WFC_Device_DestroyMask(WFC_DEVICE* device, WFCMask mask)
sl@0
   956
{
sl@0
   957
    OWF_ASSERT(device);
sl@0
   958
    return WFC_Device_DestroyImageProvider(device, mask);
sl@0
   959
}
sl@0
   960
sl@0
   961
/*---------------------------------------------------------------------------
sl@0
   962
 *
sl@0
   963
 *----------------------------------------------------------------------------*/
sl@0
   964
OWF_API_CALL WFC_IMAGE_PROVIDER*
sl@0
   965
WFC_Device_FindSource(WFC_DEVICE* device, WFCSource source)
sl@0
   966
{
sl@0
   967
    OWF_ASSERT(device);
sl@0
   968
    return WFC_Device_FindImageProvider(device, source, WFC_IMAGE_SOURCE);
sl@0
   969
}
sl@0
   970
sl@0
   971
/*---------------------------------------------------------------------------
sl@0
   972
 *
sl@0
   973
 *----------------------------------------------------------------------------*/
sl@0
   974
OWF_API_CALL WFC_IMAGE_PROVIDER*
sl@0
   975
WFC_Device_FindMask(WFC_DEVICE* device, WFCMask mask)
sl@0
   976
{
sl@0
   977
    OWF_ASSERT(device);
sl@0
   978
    return WFC_Device_FindImageProvider(device, mask, WFC_IMAGE_MASK);
sl@0
   979
}
sl@0
   980
sl@0
   981
/*---------------------------------------------------------------------------
sl@0
   982
 *  Destroy device, or rather queue it for destruction.
sl@0
   983
 *
sl@0
   984
 *  \param device Device
sl@0
   985
 *----------------------------------------------------------------------------*/
sl@0
   986
OWF_API_CALL void
sl@0
   987
WFC_Device_Destroy(WFC_DEVICE* device)
sl@0
   988
{
sl@0
   989
    ENTER(WFC_Device_Destroy);
sl@0
   990
sl@0
   991
    OWF_ASSERT(device);
sl@0
   992
sl@0
   993
    /* release resources */
sl@0
   994
    WFC_Device_DestroyElements(device);
sl@0
   995
    WFC_Device_DestroyImageProviders(device);
sl@0
   996
    WFC_Device_DestroyContexts(device);
sl@0
   997
sl@0
   998
    OWF_Mutex_Destroy(&device->mutex);
sl@0
   999
    device->mutex = NULL;
sl@0
  1000
sl@0
  1001
    device->latestUnreadError = WFC_ERROR_NONE;
sl@0
  1002
    device->handle = WFC_INVALID_HANDLE;
sl@0
  1003
    
sl@0
  1004
    OWF_Array_RemoveItem(&(gPhyDevice.iDeviceInstanceArray), device);
sl@0
  1005
    xfree(device);
sl@0
  1006
    if (gPhyDevice.iDeviceInstanceArray.length == 0)
sl@0
  1007
        {
sl@0
  1008
        OWF_Array_Destroy(&(gPhyDevice.iDeviceInstanceArray));
sl@0
  1009
        }
sl@0
  1010
    LEAVE(WFC_Device_Destroy);
sl@0
  1011
}
sl@0
  1012
sl@0
  1013
/*---------------------------------------------------------------------------
sl@0
  1014
 *
sl@0
  1015
 *----------------------------------------------------------------------------*/
sl@0
  1016
OWF_API_CALL WFCboolean
sl@0
  1017
WFC_Device_StreamIsTarget(WFC_DEVICE* device,
sl@0
  1018
                          WFCNativeStreamType stream)
sl@0
  1019
{
sl@0
  1020
    WFCint                  i;
sl@0
  1021
    WFCboolean              result = WFC_FALSE;
sl@0
  1022
sl@0
  1023
    OWF_ASSERT(device);
sl@0
  1024
sl@0
  1025
    for (i = 0; i < device->contexts.length; i++)
sl@0
  1026
    {
sl@0
  1027
        WFC_CONTEXT*        ctmp;
sl@0
  1028
sl@0
  1029
        ctmp = CONTEXT(OWF_Array_GetItemAt(&device->contexts, i));
sl@0
  1030
        if (ctmp->stream == stream)
sl@0
  1031
        {
sl@0
  1032
            result = WFC_TRUE;
sl@0
  1033
            break;
sl@0
  1034
        }
sl@0
  1035
    }
sl@0
  1036
    return result;
sl@0
  1037
}
sl@0
  1038
sl@0
  1039
/*---------------------------------------------------------------------------
sl@0
  1040
 *
sl@0
  1041
 *----------------------------------------------------------------------------*/
sl@0
  1042
OWF_API_CALL WFC_CONTEXT*
sl@0
  1043
WFC_Device_FindContextByScreen(WFC_DEVICE* device,
sl@0
  1044
                               WFCint screenNumber)
sl@0
  1045
{
sl@0
  1046
    WFCint                  i;
sl@0
  1047
    WFC_CONTEXT*            result = NULL;
sl@0
  1048
sl@0
  1049
    OWF_ASSERT(device);
sl@0
  1050
sl@0
  1051
    for (i = 0; i < device->contexts.length; i++)
sl@0
  1052
    {
sl@0
  1053
        WFC_CONTEXT*        ctmp;
sl@0
  1054
sl@0
  1055
        ctmp = CONTEXT(OWF_Array_GetItemAt(&device->contexts, i));
sl@0
  1056
        if (ctmp->screenNumber == screenNumber)
sl@0
  1057
        {
sl@0
  1058
            result = ctmp;
sl@0
  1059
            break;
sl@0
  1060
        }
sl@0
  1061
    }
sl@0
  1062
    return result;
sl@0
  1063
sl@0
  1064
}
sl@0
  1065
sl@0
  1066
/*---------------------------------------------------------------------------
sl@0
  1067
 *  Called from context's destructor to clean up any elements that
sl@0
  1068
 *  weren't added to any scene at all i.e. they only reside in the
sl@0
  1069
 *  device's element list. These elements must not stay alive after
sl@0
  1070
 *  the context has been deleted.
sl@0
  1071
 *----------------------------------------------------------------------------*/
sl@0
  1072
OWF_API_CALL void
sl@0
  1073
WFC_Device_DestroyContextElements(WFC_DEVICE* device,
sl@0
  1074
                                  WFC_CONTEXT* context)
sl@0
  1075
{
sl@0
  1076
    WFCint                  i;
sl@0
  1077
sl@0
  1078
    DPRINT(("WFC_Device_DestroyContextElements(device=%d, context=%d",
sl@0
  1079
            device ? device->handle : 0,
sl@0
  1080
            context ? context->handle : 0));
sl@0
  1081
sl@0
  1082
    if (!device || !context)
sl@0
  1083
    {
sl@0
  1084
        return;
sl@0
  1085
    }
sl@0
  1086
sl@0
  1087
    for (i = device->elements.length; i > 0; i--)
sl@0
  1088
    {
sl@0
  1089
        WFC_ELEMENT*        element;
sl@0
  1090
sl@0
  1091
        element = ELEMENT(OWF_Array_GetItemAt(&device->elements, i-1));
sl@0
  1092
        if (element->context == context)
sl@0
  1093
        {
sl@0
  1094
            DPRINT(("  Destroying element %d (%p)", element->handle, element));
sl@0
  1095
sl@0
  1096
            /* Improvement idea: This code is partially same as in
sl@0
  1097
             * WFC_Device_RemoveElement. Maybe the common part should
sl@0
  1098
             * be isolated into some DoRemoveElement function which then
sl@0
  1099
             * would be called from here and RemoveElement.
sl@0
  1100
             */
sl@0
  1101
            WFC_Context_RemoveElement(CONTEXT(element->context), element->handle);
sl@0
  1102
            OWF_Array_RemoveItemAt(&device->elements, i-1);
sl@0
  1103
            WFC_Element_Destroy(element);
sl@0
  1104
        }
sl@0
  1105
    }
sl@0
  1106
}
sl@0
  1107
sl@0
  1108
/*---------------------------------------------------------------------------
sl@0
  1109
 *
sl@0
  1110
 *----------------------------------------------------------------------------*/
sl@0
  1111
OWF_API_CALL void
sl@0
  1112
WFC_Device_DestroyContextImageProviders(WFC_DEVICE* device,
sl@0
  1113
                                        WFC_CONTEXT* context)
sl@0
  1114
{
sl@0
  1115
    WFCint                  i;
sl@0
  1116
    
sl@0
  1117
	DPRINT(("WFC_Device_DestroyContextImageProviders(device=%d, context=%d",
sl@0
  1118
	device ? device->handle : 0,
sl@0
  1119
	context ? context->handle : 0));
sl@0
  1120
sl@0
  1121
    if (!device || !context)
sl@0
  1122
    {
sl@0
  1123
        return;
sl@0
  1124
    }
sl@0
  1125
sl@0
  1126
    for (i = device->providers.length; i > 0; i--)
sl@0
  1127
    {
sl@0
  1128
        WFC_IMAGE_PROVIDER* provider;
sl@0
  1129
sl@0
  1130
        provider = IMAGE_PROVIDER(OWF_Array_GetItemAt(&device->providers, i-1));
sl@0
  1131
        if (provider->owner == context)
sl@0
  1132
        {
sl@0
  1133
            DPRINT(("  Destroying image provider %d (%p)",
sl@0
  1134
                    provider->handle, provider));
sl@0
  1135
sl@0
  1136
            WFC_Device_DestroyImageProvider(device, provider->handle);
sl@0
  1137
        }
sl@0
  1138
    }
sl@0
  1139
}
sl@0
  1140
sl@0
  1141
OWF_API_CALL WFCboolean
sl@0
  1142
WFC_Device_FindScreenNumber(WFCint screenNumber)
sl@0
  1143
{
sl@0
  1144
    WFCint i, j, deviceArrayLength, contextArrayLength;
sl@0
  1145
    WFC_DEVICE* pDevice = NULL;
sl@0
  1146
    ENTER(WFC_Device_DestroyContext);
sl@0
  1147
sl@0
  1148
    DPRINT(("WFC_Device_CheckScreenNumber(screenNumber = %d)", screenNumber));
sl@0
  1149
sl@0
  1150
    deviceArrayLength = gPhyDevice.iDeviceInstanceArray.length;
sl@0
  1151
    for (i = 0; i < deviceArrayLength; ++i)
sl@0
  1152
    {
sl@0
  1153
        pDevice = DEVICE(OWF_Array_GetItemAt(&(gPhyDevice.iDeviceInstanceArray), i));
sl@0
  1154
        OWF_ASSERT(pDevice);
sl@0
  1155
        if (pDevice)
sl@0
  1156
        {
sl@0
  1157
            contextArrayLength = pDevice->contexts.length;
sl@0
  1158
            for (j = 0; j < contextArrayLength; j++)
sl@0
  1159
            {
sl@0
  1160
                WFC_CONTEXT*    pContext;
sl@0
  1161
                pContext = CONTEXT(OWF_Array_GetItemAt(&pDevice->contexts, j));
sl@0
  1162
                OWF_ASSERT(pContext);
sl@0
  1163
                if (pContext && (pContext->screenNumber == screenNumber))
sl@0
  1164
                {
sl@0
  1165
                    return WFC_TRUE;
sl@0
  1166
                }
sl@0
  1167
            }
sl@0
  1168
        }
sl@0
  1169
    }
sl@0
  1170
    return WFC_FALSE;
sl@0
  1171
}
sl@0
  1172
sl@0
  1173
#ifdef __cplusplus
sl@0
  1174
}
sl@0
  1175
#endif