os/graphics/graphicscomposition/openwfcompositionengine/composition/src/wfcapi.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
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
sl@0
    24
/*! \ingroup wfc
sl@0
    25
 *  \file wfcapi.c
sl@0
    26
 *  \brief OpenWF Composition SI, API implementation.
sl@0
    27
 *
sl@0
    28
 *  For function documentations, see OpenWF Composition specification 1.0
sl@0
    29
 *
sl@0
    30
 *  The general layout of an API function is:
sl@0
    31
 *  - grab API mutex (lock API)
sl@0
    32
 *  - check parameter validity
sl@0
    33
 *  - invoke implementation function (WFD_...)
sl@0
    34
 *  - unlock API
sl@0
    35
 *  - return
sl@0
    36
 *
sl@0
    37
 */
sl@0
    38
sl@0
    39
#include <string.h>
sl@0
    40
#include <stdio.h>
sl@0
    41
#include <stdlib.h>
sl@0
    42
#include <math.h>
sl@0
    43
sl@0
    44
#include <WF/wfc.h>
sl@0
    45
#include <WF/wfcext.h>
sl@0
    46
sl@0
    47
#include "wfcstructs.h"
sl@0
    48
#include "wfccontext.h"
sl@0
    49
#include "owfnativestream.h"
sl@0
    50
#include "owfscreen.h"
sl@0
    51
sl@0
    52
#define RGB_NUM_BYTES       (sizeof(WFCuint8) * 4)
sl@0
    53
sl@0
    54
#define COND_FAIL(cond,error,retval) \
sl@0
    55
    if (!(cond)) { \
sl@0
    56
        WFC_Device_SetError(dev, error); \
sl@0
    57
        WFC_Unlock(); \
sl@0
    58
        return retval; \
sl@0
    59
    }
sl@0
    60
sl@0
    61
#define COND_FAIL_NR(cond,error) \
sl@0
    62
    if (!(cond)) { \
sl@0
    63
        WFC_Device_SetError(dev, error); \
sl@0
    64
        WFC_Unlock(); \
sl@0
    65
        return; \
sl@0
    66
    }
sl@0
    67
sl@0
    68
#define GET_DEVICE(d, h, x) \
sl@0
    69
    WFC_Lock(); \
sl@0
    70
    d = WFC_Device_FindByHandle(h); \
sl@0
    71
    if (NULL == d) { \
sl@0
    72
        WFC_Unlock(); \
sl@0
    73
        return x; \
sl@0
    74
    }
sl@0
    75
sl@0
    76
#define GET_DEVICE_NR(d, h) \
sl@0
    77
    WFC_Lock(); \
sl@0
    78
    d = WFC_Device_FindByHandle(h); \
sl@0
    79
    if (WFC_INVALID_HANDLE == d) { \
sl@0
    80
        WFC_Unlock(); \
sl@0
    81
        return; \
sl@0
    82
    }
sl@0
    83
sl@0
    84
#define GET_CONTEXT_NR(c,d,h) \
sl@0
    85
    c = WFC_Device_FindContext(d, h); \
sl@0
    86
    if (WFC_INVALID_HANDLE == c) { \
sl@0
    87
        WFC_Device_SetError((d)->handle, WFC_ERROR_BAD_HANDLE); \
sl@0
    88
        WFC_Unlock(); \
sl@0
    89
        return; \
sl@0
    90
    }
sl@0
    91
sl@0
    92
#define GET_CONTEXT(c,d,h,x) \
sl@0
    93
    c = WFC_Device_FindContext(d, h); \
sl@0
    94
    if (WFC_INVALID_HANDLE == c) { \
sl@0
    95
        WFC_Device_SetError((d)->handle, WFC_ERROR_BAD_HANDLE); \
sl@0
    96
        WFC_Unlock(); \
sl@0
    97
        return x; \
sl@0
    98
    }
sl@0
    99
sl@0
   100
#define SUCCEED(retval) \
sl@0
   101
    WFC_Device_SetError(dev, WFC_ERROR_NONE); \
sl@0
   102
    WFC_Unlock(); \
sl@0
   103
    return retval
sl@0
   104
sl@0
   105
#define SUCCEED_NR() \
sl@0
   106
    WFC_Device_SetError(dev, WFC_ERROR_NONE); \
sl@0
   107
    WFC_Unlock(); \
sl@0
   108
    return
sl@0
   109
sl@0
   110
#define FAIL(err, retval) \
sl@0
   111
    WFC_Device_SetError(dev, err); \
sl@0
   112
    WFC_Unlock(); \
sl@0
   113
    return retval
sl@0
   114
sl@0
   115
#define FAIL_NR(err) \
sl@0
   116
    WFC_Device_SetError(dev, err); \
sl@0
   117
    WFC_Unlock(); \
sl@0
   118
    return
sl@0
   119
sl@0
   120
sl@0
   121
static OWF_MUTEX           mutex;
sl@0
   122
sl@0
   123
static void WFC_Cleanup()
sl@0
   124
{
sl@0
   125
    OWF_Mutex_Destroy(&mutex);
sl@0
   126
}
sl@0
   127
sl@0
   128
static void WFC_Lock()
sl@0
   129
{
sl@0
   130
    if (!mutex)
sl@0
   131
    {
sl@0
   132
        OWF_Mutex_Init(&mutex);
sl@0
   133
        xatexit(WFC_Cleanup);   // Use adaptation version of atexit
sl@0
   134
    }
sl@0
   135
    OWF_Mutex_Lock(&mutex);
sl@0
   136
}
sl@0
   137
sl@0
   138
static void WFC_Unlock()
sl@0
   139
{
sl@0
   140
    OWF_Mutex_Unlock(&mutex);
sl@0
   141
}
sl@0
   142
sl@0
   143
/*=========================================================================*/
sl@0
   144
/*  4. DEVICE                                                              */
sl@0
   145
/*=========================================================================*/
sl@0
   146
sl@0
   147
WFC_API_CALL WFCint WFC_APIENTRY
sl@0
   148
wfcEnumerateDevices(WFCint *deviceIds,
sl@0
   149
                    WFCint deviceIdsCount,
sl@0
   150
                    const WFCint *filterList)
sl@0
   151
{
sl@0
   152
    WFCint                  n;
sl@0
   153
sl@0
   154
    /* populate list with device IDs */
sl@0
   155
    n = WFC_Devices_GetIds(deviceIds, deviceIdsCount, filterList);
sl@0
   156
    return n;
sl@0
   157
}
sl@0
   158
sl@0
   159
WFC_API_CALL WFCDevice WFC_APIENTRY
sl@0
   160
wfcCreateDevice(WFCint deviceId, const WFCint *attribList)
sl@0
   161
{
sl@0
   162
    WFCDevice               device;
sl@0
   163
sl@0
   164
    /* currently only empty attribute list or NULL is allowed */
sl@0
   165
    if (attribList && *attribList != WFC_NONE)
sl@0
   166
    {
sl@0
   167
sl@0
   168
        return WFC_INVALID_HANDLE;
sl@0
   169
    }
sl@0
   170
    WFC_Lock();
sl@0
   171
    device = WFC_Device_Create(deviceId);
sl@0
   172
    WFC_Unlock();
sl@0
   173
sl@0
   174
    return device;
sl@0
   175
}
sl@0
   176
sl@0
   177
WFC_API_CALL WFCErrorCode WFC_APIENTRY
sl@0
   178
wfcDestroyDevice(WFCDevice dev)
sl@0
   179
{
sl@0
   180
    WFC_DEVICE*             device;
sl@0
   181
    WFCErrorCode            result = WFC_ERROR_BAD_DEVICE;
sl@0
   182
sl@0
   183
    DPRINT(("wfcDestroyDevice(%d)", dev));
sl@0
   184
sl@0
   185
    WFC_Lock();
sl@0
   186
    device = WFC_Device_FindByHandle(dev);
sl@0
   187
    if (device)
sl@0
   188
    {
sl@0
   189
        WFC_Device_Destroy(device);
sl@0
   190
        result = WFC_ERROR_NONE;
sl@0
   191
    }
sl@0
   192
    WFC_Unlock();
sl@0
   193
    return result;
sl@0
   194
}
sl@0
   195
sl@0
   196
WFC_API_CALL WFCint WFC_APIENTRY
sl@0
   197
wfcGetDeviceAttribi(WFCDevice dev,
sl@0
   198
                    WFCDeviceAttrib attrib)
sl@0
   199
{
sl@0
   200
    WFC_DEVICE*             device;
sl@0
   201
    WFCint                  result = 0;
sl@0
   202
    WFCErrorCode            err;
sl@0
   203
sl@0
   204
    GET_DEVICE(device, dev, 0);
sl@0
   205
    err = WFC_Device_GetAttribi(device, attrib, &result);
sl@0
   206
sl@0
   207
    FAIL(err, result);
sl@0
   208
}
sl@0
   209
sl@0
   210
WFC_API_CALL WFCErrorCode WFC_APIENTRY
sl@0
   211
wfcGetError(WFCDevice dev)
sl@0
   212
{
sl@0
   213
    WFC_DEVICE* device;
sl@0
   214
    WFCErrorCode            err;
sl@0
   215
sl@0
   216
    GET_DEVICE(device, dev, WFC_ERROR_BAD_DEVICE);
sl@0
   217
sl@0
   218
    err = WFC_Device_GetError(device);
sl@0
   219
    WFC_Unlock();
sl@0
   220
    return err;
sl@0
   221
}
sl@0
   222
sl@0
   223
WFC_API_CALL void WFC_APIENTRY
sl@0
   224
wfcCommit(WFCDevice dev, WFCContext ctx, WFCboolean wait)
sl@0
   225
{
sl@0
   226
    WFC_DEVICE*             device;
sl@0
   227
    WFC_CONTEXT*            context;
sl@0
   228
    WFCErrorCode            error;
sl@0
   229
sl@0
   230
    DPRINT(("wfcCommit(%d,%d,%d)", dev, ctx, wait));
sl@0
   231
    GET_DEVICE_NR(device, dev);
sl@0
   232
    GET_CONTEXT_NR(context, device, ctx);
sl@0
   233
sl@0
   234
    error = WFC_Context_InvokeCommit(device, context, wait);
sl@0
   235
sl@0
   236
    FAIL_NR(error);
sl@0
   237
}
sl@0
   238
sl@0
   239
/*=========================================================================*/
sl@0
   240
/* 5. CONTEXT                                                              */
sl@0
   241
/*=========================================================================*/
sl@0
   242
sl@0
   243
WFC_API_CALL WFCContext WFC_APIENTRY
sl@0
   244
wfcCreateOnScreenContext(WFCDevice dev,
sl@0
   245
                         WFCint screenNumber,
sl@0
   246
                         const WFCint* attribList)
sl@0
   247
{
sl@0
   248
    WFC_CONTEXT*            context = NULL;
sl@0
   249
    WFC_DEVICE*             device = NULL;
sl@0
   250
sl@0
   251
    GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
sl@0
   252
sl@0
   253
    /* currently only empty attribute list or NULL is allowed */
sl@0
   254
    COND_FAIL(!(attribList && *attribList != WFC_NONE),
sl@0
   255
              WFC_ERROR_BAD_ATTRIBUTE,
sl@0
   256
              WFC_INVALID_HANDLE);
sl@0
   257
sl@0
   258
    if (screenNumber == WFC_DEFAULT_SCREEN_NUMBER)
sl@0
   259
    {
sl@0
   260
        screenNumber = OWF_Screen_GetDefaultNumber();
sl@0
   261
    }
sl@0
   262
    
sl@0
   263
    /* check screen number validity */
sl@0
   264
    if (!OWF_Screen_Valid(screenNumber))
sl@0
   265
    {
sl@0
   266
        FAIL(WFC_ERROR_UNSUPPORTED, WFC_INVALID_HANDLE);
sl@0
   267
    }
sl@0
   268
sl@0
   269
    /* check that no other context currently uses this screen */
sl@0
   270
    if (WFC_Device_FindScreenNumber(screenNumber))
sl@0
   271
    {
sl@0
   272
        FAIL(WFC_ERROR_IN_USE, WFC_INVALID_HANDLE);
sl@0
   273
    }
sl@0
   274
sl@0
   275
sl@0
   276
    context = WFC_Device_CreateContext(device,
sl@0
   277
                                       WFC_INVALID_HANDLE,
sl@0
   278
                                       WFC_CONTEXT_TYPE_ON_SCREEN,
sl@0
   279
                                       screenNumber);
sl@0
   280
    if (!context)
sl@0
   281
    {
sl@0
   282
        FAIL(WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
sl@0
   283
    }
sl@0
   284
sl@0
   285
    SUCCEED(context->handle);
sl@0
   286
}
sl@0
   287
sl@0
   288
WFC_API_CALL WFCContext WFC_APIENTRY
sl@0
   289
wfcCreateOffScreenContext(WFCDevice dev,
sl@0
   290
                          WFCNativeStreamType stream,
sl@0
   291
                          const WFCint *attribList)
sl@0
   292
{
sl@0
   293
    WFC_CONTEXT*            context = NULL;
sl@0
   294
    WFC_DEVICE*             device = NULL;
sl@0
   295
    OWFNativeStreamType 	internalStream=OWF_INVALID_HANDLE;
sl@0
   296
    OWF_STREAM_ERROR 		streamError;
sl@0
   297
    
sl@0
   298
    GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
sl@0
   299
sl@0
   300
    /* currently only empty attribute list or NULL is allowed */
sl@0
   301
    COND_FAIL(!(attribList && *attribList != WFC_NONE),
sl@0
   302
              WFC_ERROR_BAD_ATTRIBUTE,
sl@0
   303
              WFC_INVALID_HANDLE);
sl@0
   304
sl@0
   305
    COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream,
sl@0
   306
              WFC_ERROR_ILLEGAL_ARGUMENT,
sl@0
   307
              WFC_INVALID_HANDLE);
sl@0
   308
    internalStream=owfNativeStreamFromWFC(stream,&streamError);
sl@0
   309
    COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE);
sl@0
   310
    COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE);
sl@0
   311
    
sl@0
   312
    if (!WFC_Context_IsValidTargetStream(internalStream))
sl@0
   313
    {
sl@0
   314
        owfNativeStreamDestroy(internalStream); /*cancel owfNativeStreamFromWFC reference increase*/
sl@0
   315
        FAIL(WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE);
sl@0
   316
    }
sl@0
   317
    context = WFC_Device_CreateContext(device, internalStream,
sl@0
   318
                                       WFC_CONTEXT_TYPE_OFF_SCREEN,
sl@0
   319
                                       OWF_RESERVED_BAD_SCREEN_NUMBER);
sl@0
   320
    owfNativeStreamDestroy(internalStream);	/*cancel owfNativeStreamFromWFC reference increase*/
sl@0
   321
    COND_FAIL(NULL != context, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
sl@0
   322
sl@0
   323
    SUCCEED(context->handle);
sl@0
   324
}
sl@0
   325
sl@0
   326
WFC_API_CALL void WFC_APIENTRY
sl@0
   327
wfcDestroyContext(WFCDevice dev,
sl@0
   328
                  WFCContext ctx)
sl@0
   329
{
sl@0
   330
    WFC_DEVICE*             device = NULL;
sl@0
   331
    WFCErrorCode            err;
sl@0
   332
sl@0
   333
    DPRINT(("wfcDestroyContext(%d, %d)", dev, ctx));
sl@0
   334
    GET_DEVICE_NR(device, dev);
sl@0
   335
sl@0
   336
    err = WFC_Device_DestroyContext(device, ctx);
sl@0
   337
    FAIL_NR(err);
sl@0
   338
}
sl@0
   339
sl@0
   340
WFC_API_CALL WFCint WFC_APIENTRY
sl@0
   341
wfcGetContextAttribi(WFCDevice dev,
sl@0
   342
                     WFCContext ctx,
sl@0
   343
                     WFCContextAttrib attrib)
sl@0
   344
{
sl@0
   345
    WFC_CONTEXT*            context = NULL;
sl@0
   346
    WFC_DEVICE*             device = NULL;
sl@0
   347
    WFCint                  value = 0;
sl@0
   348
    WFCErrorCode            err;
sl@0
   349
sl@0
   350
    GET_DEVICE(device, dev, 0);
sl@0
   351
    GET_CONTEXT(context, device, ctx, 0);
sl@0
   352
sl@0
   353
    err = WFC_Context_GetAttribi(context, attrib, &value);
sl@0
   354
sl@0
   355
    FAIL(err, value);
sl@0
   356
}
sl@0
   357
sl@0
   358
WFC_API_CALL void WFC_APIENTRY
sl@0
   359
wfcSetContextAttribi(WFCDevice dev,
sl@0
   360
                     WFCContext ctx,
sl@0
   361
                     WFCContextAttrib attrib,
sl@0
   362
                     WFCint value)
sl@0
   363
{
sl@0
   364
    WFC_DEVICE*             device;
sl@0
   365
    WFC_CONTEXT*            context;
sl@0
   366
    WFCErrorCode            err;
sl@0
   367
sl@0
   368
    GET_DEVICE_NR(device, dev);
sl@0
   369
    GET_CONTEXT_NR(context, device, ctx);
sl@0
   370
sl@0
   371
    err = WFC_Context_SetAttribi(context, attrib, value);
sl@0
   372
    FAIL_NR(err);
sl@0
   373
}
sl@0
   374
sl@0
   375
WFC_API_CALL void WFC_APIENTRY
sl@0
   376
wfcGetContextAttribfv(WFCDevice dev,
sl@0
   377
                      WFCContext ctx,
sl@0
   378
                      WFCContextAttrib attrib,
sl@0
   379
                      WFCint count,
sl@0
   380
                      WFCfloat *values) WFC_APIEXIT
sl@0
   381
{
sl@0
   382
    WFC_DEVICE*             device;
sl@0
   383
    WFC_CONTEXT*            context;
sl@0
   384
    WFCErrorCode            err;
sl@0
   385
sl@0
   386
    GET_DEVICE_NR(device, dev);
sl@0
   387
    GET_CONTEXT_NR(context, device, ctx);
sl@0
   388
sl@0
   389
    err = WFC_Context_GetAttribfv(context, attrib, count, values);
sl@0
   390
    FAIL_NR(err);
sl@0
   391
}
sl@0
   392
sl@0
   393
WFC_API_CALL void WFC_APIENTRY
sl@0
   394
wfcSetContextAttribfv(WFCDevice dev,
sl@0
   395
                      WFCContext ctx,
sl@0
   396
                      WFCContextAttrib attrib,
sl@0
   397
                      WFCint count,
sl@0
   398
                      const WFCfloat *values) WFC_APIEXIT
sl@0
   399
{
sl@0
   400
      WFC_DEVICE*             device;
sl@0
   401
      WFC_CONTEXT*            context;
sl@0
   402
      WFCErrorCode            err;
sl@0
   403
sl@0
   404
      GET_DEVICE_NR(device, dev);
sl@0
   405
      GET_CONTEXT_NR(context, device, ctx);
sl@0
   406
sl@0
   407
      err = WFC_Context_SetAttribfv(context, attrib, count, values);
sl@0
   408
      FAIL_NR(err);
sl@0
   409
}
sl@0
   410
sl@0
   411
/*=========================================================================*/
sl@0
   412
/* 6. IMAGE PROVIDERS (SOURCES & MASKS)                                    */
sl@0
   413
/*=========================================================================*/
sl@0
   414
sl@0
   415
WFC_API_CALL WFCSource WFC_APIENTRY
sl@0
   416
wfcCreateSourceFromStream(WFCDevice dev,
sl@0
   417
                          WFCContext ctx,
sl@0
   418
                          WFCNativeStreamType stream,
sl@0
   419
                          const WFCint *attribList)
sl@0
   420
{
sl@0
   421
    WFC_DEVICE*             device;
sl@0
   422
    WFC_IMAGE_PROVIDER*     source;
sl@0
   423
    WFC_CONTEXT*            context;
sl@0
   424
    OWFNativeStreamType 	internalStream=OWF_INVALID_HANDLE;
sl@0
   425
    OWF_STREAM_ERROR 		streamError;
sl@0
   426
sl@0
   427
    GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
sl@0
   428
sl@0
   429
    /* currently only empty attribute list or NULL is allowed */
sl@0
   430
    COND_FAIL(!(attribList && *attribList != WFC_NONE),
sl@0
   431
              WFC_ERROR_BAD_ATTRIBUTE,
sl@0
   432
              WFC_INVALID_HANDLE);
sl@0
   433
sl@0
   434
    GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE);
sl@0
   435
    COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream,
sl@0
   436
              WFC_ERROR_ILLEGAL_ARGUMENT,
sl@0
   437
              WFC_INVALID_HANDLE);
sl@0
   438
sl@0
   439
    internalStream=owfNativeStreamFromWFC(stream,&streamError);
sl@0
   440
    COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE);
sl@0
   441
    COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE);
sl@0
   442
sl@0
   443
    if (context->stream == internalStream)
sl@0
   444
    	{
sl@0
   445
    	owfNativeStreamDestroy(internalStream);
sl@0
   446
        FAIL( WFC_ERROR_IN_USE, WFC_INVALID_HANDLE);
sl@0
   447
    	}
sl@0
   448
    
sl@0
   449
    if (!WFC_Context_IsValidSourceStream(internalStream))
sl@0
   450
        {
sl@0
   451
        owfNativeStreamDestroy(internalStream);
sl@0
   452
        FAIL( WFC_ERROR_UNSUPPORTED, WFC_INVALID_HANDLE);
sl@0
   453
        }
sl@0
   454
sl@0
   455
    source = WFC_Device_CreateSource(device, context, internalStream);
sl@0
   456
    owfNativeStreamDestroy(internalStream);	/*cancel FromWFC reference increase*/
sl@0
   457
    COND_FAIL(NULL != source, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
sl@0
   458
sl@0
   459
    SUCCEED(source->handle);
sl@0
   460
}
sl@0
   461
sl@0
   462
WFC_API_CALL void WFC_APIENTRY
sl@0
   463
wfcDestroySource(WFCDevice dev,
sl@0
   464
                 WFCSource src)
sl@0
   465
{
sl@0
   466
    WFC_DEVICE*             device;
sl@0
   467
    WFCErrorCode            err;
sl@0
   468
sl@0
   469
    GET_DEVICE_NR(device, dev);
sl@0
   470
sl@0
   471
    err = WFC_Device_DestroySource(device, src);
sl@0
   472
sl@0
   473
    FAIL_NR(err);
sl@0
   474
}
sl@0
   475
sl@0
   476
WFC_API_CALL WFCMask WFC_APIENTRY
sl@0
   477
wfcCreateMaskFromStream(WFCDevice dev,
sl@0
   478
                        WFCContext ctx,
sl@0
   479
                        WFCNativeStreamType stream,
sl@0
   480
                        const WFCint *attribList) WFC_APIEXIT
sl@0
   481
{
sl@0
   482
    WFC_DEVICE*             device;
sl@0
   483
    WFC_CONTEXT*            context;
sl@0
   484
    WFC_IMAGE_PROVIDER*     mask;
sl@0
   485
    WFCboolean              inUse;
sl@0
   486
    OWFNativeStreamType 	internalStream=OWF_INVALID_HANDLE;
sl@0
   487
    OWF_STREAM_ERROR 		streamError;
sl@0
   488
sl@0
   489
sl@0
   490
    GET_DEVICE(device, dev, WFC_ERROR_BAD_DEVICE);
sl@0
   491
sl@0
   492
    /* currently only empty attribute list or NULL is allowed */
sl@0
   493
    COND_FAIL(!(attribList && *attribList != WFC_NONE),
sl@0
   494
              WFC_ERROR_BAD_ATTRIBUTE,
sl@0
   495
              WFC_INVALID_HANDLE);
sl@0
   496
sl@0
   497
    GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE);
sl@0
   498
    COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream,
sl@0
   499
              WFC_ERROR_ILLEGAL_ARGUMENT,
sl@0
   500
              WFC_INVALID_HANDLE);
sl@0
   501
sl@0
   502
    internalStream=owfNativeStreamFromWFC(stream,&streamError);
sl@0
   503
    COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE);
sl@0
   504
    COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE);
sl@0
   505
sl@0
   506
    inUse = WFC_Device_StreamIsTarget(device, internalStream);
sl@0
   507
    if (inUse)
sl@0
   508
    	{
sl@0
   509
       	owfNativeStreamDestroy(internalStream);
sl@0
   510
        FAIL( WFC_ERROR_IN_USE, WFC_INVALID_HANDLE);
sl@0
   511
       	}
sl@0
   512
sl@0
   513
    mask = WFC_Device_CreateMask(device, context, internalStream);
sl@0
   514
    owfNativeStreamDestroy(internalStream);	/*cancel FromWFC reference increase*/
sl@0
   515
    COND_FAIL(NULL != mask, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
sl@0
   516
sl@0
   517
    SUCCEED(mask->handle);
sl@0
   518
}
sl@0
   519
sl@0
   520
WFC_API_CALL void WFC_APIENTRY
sl@0
   521
wfcDestroyMask(WFCDevice dev,
sl@0
   522
               WFCMask mask) WFC_APIEXIT
sl@0
   523
{
sl@0
   524
    WFC_DEVICE*             device;
sl@0
   525
    WFCErrorCode            error;
sl@0
   526
sl@0
   527
    GET_DEVICE_NR(device, dev);
sl@0
   528
sl@0
   529
    error = WFC_Device_DestroyMask(device, mask);
sl@0
   530
sl@0
   531
    FAIL_NR(error);
sl@0
   532
}
sl@0
   533
sl@0
   534
/*=========================================================================*/
sl@0
   535
/* 7. COMPOSITION ELEMENTS                                                 */
sl@0
   536
/*=========================================================================*/
sl@0
   537
sl@0
   538
WFC_API_CALL WFCElement WFC_APIENTRY
sl@0
   539
wfcCreateElement(WFCDevice dev,
sl@0
   540
                 WFCContext ctx,
sl@0
   541
                 const WFCint* attribList) WFC_APIEXIT
sl@0
   542
{
sl@0
   543
    WFC_DEVICE*             device;
sl@0
   544
    WFC_ELEMENT*            element;
sl@0
   545
    WFC_CONTEXT*            context;
sl@0
   546
sl@0
   547
    GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
sl@0
   548
sl@0
   549
    /* currently only empty attribute list or NULL is allowed */
sl@0
   550
    COND_FAIL(!(attribList && *attribList != WFC_NONE),
sl@0
   551
              WFC_ERROR_BAD_ATTRIBUTE,
sl@0
   552
              WFC_INVALID_HANDLE);
sl@0
   553
sl@0
   554
    GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE);
sl@0
   555
sl@0
   556
    element = WFC_Device_CreateElement(device, context);
sl@0
   557
    COND_FAIL(NULL != element, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE);
sl@0
   558
sl@0
   559
    SUCCEED(element->handle);
sl@0
   560
}
sl@0
   561
sl@0
   562
WFC_API_CALL void WFC_APIENTRY
sl@0
   563
wfcDestroyElement(WFCDevice dev,
sl@0
   564
                  WFCElement element) WFC_APIEXIT
sl@0
   565
{
sl@0
   566
    WFC_DEVICE*             device;
sl@0
   567
    WFCErrorCode            error = WFC_ERROR_BAD_HANDLE;
sl@0
   568
sl@0
   569
    GET_DEVICE_NR(device, dev);
sl@0
   570
sl@0
   571
    error = WFC_Device_DestroyElement(device, element);
sl@0
   572
sl@0
   573
    FAIL_NR(error);
sl@0
   574
}
sl@0
   575
sl@0
   576
#define ATTR_FUNC_PROLOGUE  \
sl@0
   577
    WFCErrorCode            error; \
sl@0
   578
    WFC_DEVICE*             device; \
sl@0
   579
    \
sl@0
   580
    GET_DEVICE(device, dev, 0)
sl@0
   581
sl@0
   582
#define ATTR_FUNC_PROLOGUE_NR  \
sl@0
   583
    WFCErrorCode            error; \
sl@0
   584
    WFC_DEVICE*             device; \
sl@0
   585
    \
sl@0
   586
    GET_DEVICE_NR(device, dev)
sl@0
   587
sl@0
   588
#define ATTR_FUNC_EPILOGUE(x) \
sl@0
   589
    FAIL(error, x)
sl@0
   590
sl@0
   591
#define ATTR_FUNC_EPILOGUE_NR \
sl@0
   592
    FAIL_NR(error)
sl@0
   593
sl@0
   594
WFC_API_CALL WFCint WFC_APIENTRY
sl@0
   595
wfcGetElementAttribi(WFCDevice dev,
sl@0
   596
                     WFCElement element,
sl@0
   597
                     WFCElementAttrib attrib) WFC_APIEXIT
sl@0
   598
{
sl@0
   599
    WFCint                  value;
sl@0
   600
sl@0
   601
    ATTR_FUNC_PROLOGUE;
sl@0
   602
sl@0
   603
    error = WFC_Device_GetElementAttribiv(device, element, attrib, 1, &value);
sl@0
   604
sl@0
   605
    ATTR_FUNC_EPILOGUE(value);
sl@0
   606
}
sl@0
   607
sl@0
   608
WFC_API_CALL WFCfloat WFC_APIENTRY
sl@0
   609
wfcGetElementAttribf(WFCDevice dev,
sl@0
   610
                     WFCElement element,
sl@0
   611
                     WFCElementAttrib attrib) WFC_APIEXIT
sl@0
   612
{
sl@0
   613
    WFCfloat                value;
sl@0
   614
sl@0
   615
    ATTR_FUNC_PROLOGUE;
sl@0
   616
sl@0
   617
    COND_FAIL(WFC_ELEMENT_GLOBAL_ALPHA == attrib,
sl@0
   618
              WFC_ERROR_BAD_ATTRIBUTE,
sl@0
   619
              0.0f);
sl@0
   620
sl@0
   621
    error = WFC_Device_GetElementAttribfv(device, element, attrib, 1, &value);
sl@0
   622
sl@0
   623
    /* value is [0, OWF_ALPHA_MAX_VALUE], map to [0, 1] */
sl@0
   624
    value = value / OWF_ALPHA_MAX_VALUE;
sl@0
   625
sl@0
   626
    ATTR_FUNC_EPILOGUE(value);
sl@0
   627
}
sl@0
   628
sl@0
   629
WFC_API_CALL void WFC_APIENTRY
sl@0
   630
wfcGetElementAttribiv(WFCDevice dev,
sl@0
   631
                      WFCElement element,
sl@0
   632
                      WFCElementAttrib attrib,
sl@0
   633
                      WFCint count,
sl@0
   634
                      WFCint *values) WFC_APIEXIT
sl@0
   635
{
sl@0
   636
    ATTR_FUNC_PROLOGUE_NR;
sl@0
   637
sl@0
   638
    COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib ||
sl@0
   639
                 WFC_ELEMENT_DESTINATION_RECTANGLE == attrib,
sl@0
   640
                 WFC_ERROR_BAD_ATTRIBUTE);
sl@0
   641
sl@0
   642
    error = WFC_Device_GetElementAttribiv(device, element, attrib, count,
sl@0
   643
                                          values);
sl@0
   644
    ATTR_FUNC_EPILOGUE_NR;
sl@0
   645
}
sl@0
   646
sl@0
   647
WFC_API_CALL void WFC_APIENTRY
sl@0
   648
wfcGetElementAttribfv(WFCDevice dev,
sl@0
   649
                      WFCElement element,
sl@0
   650
                      WFCElementAttrib attrib,
sl@0
   651
                      WFCint count,
sl@0
   652
                      WFCfloat *values) WFC_APIEXIT
sl@0
   653
{
sl@0
   654
    ATTR_FUNC_PROLOGUE_NR;
sl@0
   655
sl@0
   656
    COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib ||
sl@0
   657
                 WFC_ELEMENT_DESTINATION_RECTANGLE == attrib,
sl@0
   658
                 WFC_ERROR_BAD_ATTRIBUTE);
sl@0
   659
sl@0
   660
    error = WFC_Device_GetElementAttribfv(device, element, attrib, count,
sl@0
   661
                                          values);
sl@0
   662
sl@0
   663
    ATTR_FUNC_EPILOGUE_NR;
sl@0
   664
}
sl@0
   665
sl@0
   666
WFC_API_CALL void WFC_APIENTRY
sl@0
   667
wfcSetElementAttribi(WFCDevice dev,
sl@0
   668
                     WFCElement element,
sl@0
   669
                     WFCElementAttrib attrib,
sl@0
   670
                     WFCint value) WFC_APIEXIT
sl@0
   671
{
sl@0
   672
    ATTR_FUNC_PROLOGUE_NR;
sl@0
   673
sl@0
   674
    error = WFC_Device_SetElementAttribiv(device, element, attrib, 1, &value);
sl@0
   675
sl@0
   676
    ATTR_FUNC_EPILOGUE_NR;
sl@0
   677
}
sl@0
   678
sl@0
   679
WFC_API_CALL void WFC_APIENTRY
sl@0
   680
wfcSetElementAttribf(WFCDevice dev,
sl@0
   681
                     WFCElement element,
sl@0
   682
                     WFCElementAttrib attrib,
sl@0
   683
                     WFCfloat value) WFC_APIEXIT
sl@0
   684
{
sl@0
   685
    ATTR_FUNC_PROLOGUE_NR;
sl@0
   686
sl@0
   687
    COND_FAIL_NR(WFC_ELEMENT_GLOBAL_ALPHA == attrib,
sl@0
   688
                 WFC_ERROR_BAD_ATTRIBUTE);
sl@0
   689
sl@0
   690
    error = WFC_Device_SetElementAttribfv(device, element, attrib, 1, &value);
sl@0
   691
sl@0
   692
    ATTR_FUNC_EPILOGUE_NR;
sl@0
   693
}
sl@0
   694
sl@0
   695
WFC_API_CALL void WFC_APIENTRY
sl@0
   696
wfcSetElementAttribiv(WFCDevice dev,
sl@0
   697
                      WFCElement element,
sl@0
   698
                      WFCElementAttrib attrib,
sl@0
   699
                      WFCint count,
sl@0
   700
                      const WFCint *values) WFC_APIEXIT
sl@0
   701
{
sl@0
   702
    ATTR_FUNC_PROLOGUE_NR;
sl@0
   703
sl@0
   704
    COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib ||
sl@0
   705
                 WFC_ELEMENT_DESTINATION_RECTANGLE == attrib,
sl@0
   706
                 WFC_ERROR_BAD_ATTRIBUTE);
sl@0
   707
sl@0
   708
    error = WFC_Device_SetElementAttribiv(device, element, attrib, count,
sl@0
   709
                                          values);
sl@0
   710
sl@0
   711
    ATTR_FUNC_EPILOGUE_NR;
sl@0
   712
}
sl@0
   713
sl@0
   714
WFC_API_CALL void WFC_APIENTRY
sl@0
   715
wfcSetElementAttribfv(WFCDevice dev,
sl@0
   716
                      WFCElement element,
sl@0
   717
                      WFCElementAttrib attrib,
sl@0
   718
                      WFCint count,
sl@0
   719
                      const WFCfloat *values) WFC_APIEXIT
sl@0
   720
{
sl@0
   721
    ATTR_FUNC_PROLOGUE_NR;
sl@0
   722
sl@0
   723
    COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib ||
sl@0
   724
                 WFC_ELEMENT_DESTINATION_RECTANGLE == attrib,
sl@0
   725
                 WFC_ERROR_BAD_ATTRIBUTE);
sl@0
   726
sl@0
   727
    error = WFC_Device_SetElementAttribfv(device, element, attrib, count,
sl@0
   728
                                          values);
sl@0
   729
sl@0
   730
    ATTR_FUNC_EPILOGUE_NR;
sl@0
   731
}
sl@0
   732
sl@0
   733
WFC_API_CALL void WFC_APIENTRY
sl@0
   734
wfcInsertElement(WFCDevice dev,
sl@0
   735
                 WFCElement element,
sl@0
   736
                 WFCElement subordinate) WFC_APIEXIT
sl@0
   737
{
sl@0
   738
    WFC_DEVICE*             device;
sl@0
   739
    WFC_ELEMENT*            elemento;
sl@0
   740
    WFCErrorCode            error;
sl@0
   741
sl@0
   742
    GET_DEVICE_NR(device, dev);
sl@0
   743
sl@0
   744
    /*
sl@0
   745
    - element is inserted immediately above subordinate
sl@0
   746
    - if subordinate is NULL, then element will go to bottom
sl@0
   747
    - both elements must be in the same scene (context)
sl@0
   748
    */
sl@0
   749
    elemento = WFC_Device_FindElement(device, element);
sl@0
   750
    COND_FAIL_NR(WFC_INVALID_HANDLE != elemento, WFC_ERROR_BAD_HANDLE);
sl@0
   751
sl@0
   752
    error = WFC_Context_InsertElement(CONTEXT(elemento->context),
sl@0
   753
                                      element,
sl@0
   754
                                      subordinate);
sl@0
   755
sl@0
   756
    FAIL_NR(error);
sl@0
   757
}
sl@0
   758
sl@0
   759
WFC_API_CALL void WFC_APIENTRY
sl@0
   760
wfcRemoveElement(WFCDevice dev,
sl@0
   761
                 WFCElement element) WFC_APIEXIT
sl@0
   762
{
sl@0
   763
    WFC_DEVICE*             device;
sl@0
   764
    WFC_ELEMENT*            elemento;
sl@0
   765
    WFCErrorCode            error;
sl@0
   766
sl@0
   767
    GET_DEVICE_NR(device, dev);
sl@0
   768
sl@0
   769
    elemento = WFC_Device_FindElement(device, element);
sl@0
   770
    COND_FAIL_NR(WFC_INVALID_HANDLE != elemento, WFC_ERROR_BAD_HANDLE);
sl@0
   771
sl@0
   772
    error = WFC_Context_RemoveElement(CONTEXT(elemento->context), element);
sl@0
   773
sl@0
   774
    FAIL_NR(error);
sl@0
   775
}
sl@0
   776
sl@0
   777
WFC_API_CALL WFCElement WFC_APIENTRY
sl@0
   778
wfcGetElementAbove(WFCDevice dev, WFCElement element) WFC_APIEXIT
sl@0
   779
{
sl@0
   780
    WFC_DEVICE*             device = NULL;
sl@0
   781
    WFC_ELEMENT*            elemento = NULL;
sl@0
   782
    WFCElement              result = WFC_INVALID_HANDLE;
sl@0
   783
    WFCErrorCode            error = WFC_ERROR_NONE;
sl@0
   784
sl@0
   785
    GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
sl@0
   786
sl@0
   787
    elemento = WFC_Device_FindElement(device, element);
sl@0
   788
    COND_FAIL(WFC_INVALID_HANDLE != elemento,
sl@0
   789
              WFC_ERROR_BAD_HANDLE,
sl@0
   790
              WFC_INVALID_HANDLE);
sl@0
   791
sl@0
   792
    error = WFC_Context_GetElementAbove(CONTEXT(elemento->context),
sl@0
   793
                                        element,
sl@0
   794
                                        &result);
sl@0
   795
sl@0
   796
    FAIL(error, result);
sl@0
   797
}
sl@0
   798
sl@0
   799
WFC_API_CALL WFCElement WFC_APIENTRY
sl@0
   800
wfcGetElementBelow(WFCDevice dev, WFCElement element) WFC_APIEXIT
sl@0
   801
{
sl@0
   802
    WFC_DEVICE*             device = NULL;
sl@0
   803
    WFC_ELEMENT*            elemento = NULL;
sl@0
   804
    WFCElement              result = WFC_INVALID_HANDLE;
sl@0
   805
    WFCErrorCode            error = WFC_ERROR_NONE;
sl@0
   806
sl@0
   807
    GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
sl@0
   808
sl@0
   809
    elemento = WFC_Device_FindElement(device, element);
sl@0
   810
    COND_FAIL(WFC_INVALID_HANDLE != elemento,
sl@0
   811
              WFC_ERROR_BAD_HANDLE,
sl@0
   812
              WFC_INVALID_HANDLE);
sl@0
   813
sl@0
   814
    error = WFC_Context_GetElementBelow(CONTEXT(elemento->context),
sl@0
   815
                                        element,
sl@0
   816
                                        &result);
sl@0
   817
sl@0
   818
    FAIL(error, result);
sl@0
   819
}
sl@0
   820
sl@0
   821
/*=========================================================================*/
sl@0
   822
/* 8. RENDERING                                                            */
sl@0
   823
/*=========================================================================*/
sl@0
   824
sl@0
   825
WFC_API_CALL void WFC_APIENTRY
sl@0
   826
wfcActivate(WFCDevice dev,
sl@0
   827
            WFCContext ctx) WFC_APIEXIT
sl@0
   828
{
sl@0
   829
    WFC_DEVICE*             device;
sl@0
   830
    WFC_CONTEXT*            context;
sl@0
   831
sl@0
   832
    GET_DEVICE_NR(device, dev);
sl@0
   833
    GET_CONTEXT_NR(context, device, ctx);
sl@0
   834
sl@0
   835
    WFC_Context_Activate(context, WFC_TRUE);
sl@0
   836
sl@0
   837
    SUCCEED_NR();
sl@0
   838
}
sl@0
   839
sl@0
   840
WFC_API_CALL void WFC_APIENTRY
sl@0
   841
wfcDeactivate(WFCDevice dev,
sl@0
   842
              WFCContext ctx) WFC_APIEXIT
sl@0
   843
{
sl@0
   844
    WFC_DEVICE*             device;
sl@0
   845
    WFC_CONTEXT*            context;
sl@0
   846
sl@0
   847
    GET_DEVICE_NR(device, dev);
sl@0
   848
    GET_CONTEXT_NR(context, device, ctx);
sl@0
   849
sl@0
   850
    WFC_Context_Activate(context, WFC_FALSE);
sl@0
   851
sl@0
   852
    SUCCEED_NR();
sl@0
   853
}
sl@0
   854
sl@0
   855
WFC_API_CALL void WFC_APIENTRY
sl@0
   856
wfcCompose(WFCDevice dev,
sl@0
   857
           WFCContext ctx,
sl@0
   858
           WFCboolean wait) WFC_APIEXIT
sl@0
   859
{
sl@0
   860
    WFC_DEVICE*             device;
sl@0
   861
    WFC_CONTEXT*            context;
sl@0
   862
    WFCboolean              able;
sl@0
   863
sl@0
   864
    GET_DEVICE_NR(device, dev);
sl@0
   865
    GET_CONTEXT_NR(context, device, ctx);
sl@0
   866
sl@0
   867
    /* context must not be active */
sl@0
   868
    COND_FAIL_NR(!WFC_Context_Active(context), WFC_ERROR_UNSUPPORTED);
sl@0
   869
sl@0
   870
    /* send composition request */
sl@0
   871
    able = WFC_Context_InvokeComposition(device, context, wait);
sl@0
   872
    COND_FAIL_NR(WFC_TRUE == able, WFC_ERROR_BUSY);
sl@0
   873
sl@0
   874
    SUCCEED_NR();
sl@0
   875
}
sl@0
   876
sl@0
   877
sl@0
   878
/*=========================================================================*/
sl@0
   879
/* 9. SYNCHRONIZATION                                                      */
sl@0
   880
/*=========================================================================*/
sl@0
   881
sl@0
   882
WFC_API_CALL void WFC_APIENTRY
sl@0
   883
wfcFence(WFCDevice dev,
sl@0
   884
         WFCContext ctx,
sl@0
   885
         WFCEGLDisplay dpy,
sl@0
   886
         WFCEGLSync sync)
sl@0
   887
{
sl@0
   888
    WFC_DEVICE*     device;
sl@0
   889
    WFC_CONTEXT*    context;
sl@0
   890
sl@0
   891
    DPRINT(("wfcFence(%08x,%08x,%08x)", dev, ctx, sync));
sl@0
   892
sl@0
   893
    GET_DEVICE_NR(device, dev);
sl@0
   894
    DPRINT(("  device = %p", device));
sl@0
   895
sl@0
   896
    GET_CONTEXT_NR(context, device, ctx);
sl@0
   897
    DPRINT(("  context = %p", context));
sl@0
   898
    
sl@0
   899
    /* unsignal sync object first */
sl@0
   900
    OWF_ASSERT(context->eglPrivateSignalSync);
sl@0
   901
    if ( !(context->eglPrivateSignalSync((EGLDisplay)dpy, sync, EGL_UNSIGNALED_KHR)) )
sl@0
   902
    {
sl@0
   903
        FAIL_NR(WFC_ERROR_ILLEGAL_ARGUMENT);
sl@0
   904
    }
sl@0
   905
sl@0
   906
    /* insert fence 'token' to command stream */
sl@0
   907
    WFC_Context_InsertFence(context, dpy, sync);
sl@0
   908
    SUCCEED_NR();
sl@0
   909
}
sl@0
   910
sl@0
   911
/*=========================================================================*/
sl@0
   912
/* 10. EXTENSION SUPPORT                                                   */
sl@0
   913
/*=========================================================================*/
sl@0
   914
sl@0
   915
WFC_API_CALL WFCint WFC_APIENTRY
sl@0
   916
wfcGetStrings(WFCDevice dev,
sl@0
   917
              WFCStringID name,
sl@0
   918
              const char **strings,
sl@0
   919
              WFCint stringsCount) WFC_APIEXIT
sl@0
   920
{
sl@0
   921
    WFC_DEVICE*             pDevice;
sl@0
   922
    const char**            tmp;
sl@0
   923
    WFCint                  retVal;
sl@0
   924
sl@0
   925
    GET_DEVICE(pDevice, dev, 0);
sl@0
   926
    COND_FAIL(stringsCount >= 0, WFC_ERROR_ILLEGAL_ARGUMENT, 0);
sl@0
   927
sl@0
   928
    switch (name)
sl@0
   929
    {
sl@0
   930
    case WFC_VENDOR:
sl@0
   931
        retVal = 1;
sl@0
   932
        tmp = &wfc_strings[WFC_VENDOR_INDEX];
sl@0
   933
        break;
sl@0
   934
sl@0
   935
    case WFC_RENDERER:
sl@0
   936
        retVal = 1;
sl@0
   937
        tmp = &wfc_strings[WFC_RENDERER_INDEX];
sl@0
   938
        break;
sl@0
   939
sl@0
   940
    case WFC_VERSION:
sl@0
   941
        retVal = 1;
sl@0
   942
        tmp = &wfc_strings[WFC_VERSION_INDEX];
sl@0
   943
        break;
sl@0
   944
sl@0
   945
    case WFC_EXTENSIONS:
sl@0
   946
        tmp = &wfc_extensions[0];
sl@0
   947
		/* we know that wfc_extensions always has NULL as the last member 
sl@0
   948
		   so this loop will never exceed the size of tmp */
sl@0
   949
		/* coverity[overrun-local] */
sl@0
   950
        for (retVal=0; tmp[retVal] != NULL; retVal++)
sl@0
   951
        {
sl@0
   952
            /* get extensions array size */
sl@0
   953
        }
sl@0
   954
        break;
sl@0
   955
sl@0
   956
    default:
sl@0
   957
        FAIL(WFC_ERROR_ILLEGAL_ARGUMENT, 0);
sl@0
   958
    }
sl@0
   959
sl@0
   960
    if (strings != NULL)
sl@0
   961
    {
sl@0
   962
        WFCint i;
sl@0
   963
sl@0
   964
        if (stringsCount < retVal)
sl@0
   965
        {
sl@0
   966
            retVal = stringsCount;
sl@0
   967
        }
sl@0
   968
        for (i=0; i<retVal; i++)
sl@0
   969
        {
sl@0
   970
            strings[i] = tmp[i];
sl@0
   971
        }
sl@0
   972
    }
sl@0
   973
sl@0
   974
    SUCCEED(retVal);
sl@0
   975
}
sl@0
   976
sl@0
   977
WFC_API_CALL WFCboolean WFC_APIENTRY
sl@0
   978
wfcIsExtensionSupported(WFCDevice dev,
sl@0
   979
                        const char *string) WFC_APIEXIT
sl@0
   980
{
sl@0
   981
    WFC_DEVICE* pDevice;
sl@0
   982
    WFCint i;
sl@0
   983
    WFCboolean retVal = WFC_FALSE;
sl@0
   984
sl@0
   985
    GET_DEVICE(pDevice, dev, retVal);
sl@0
   986
    /* Bad param does not update device error state */
sl@0
   987
    COND_FAIL(string,WFC_ERROR_NONE,retVal);
sl@0
   988
    
sl@0
   989
    for (i=0; wfc_extensions[i] != NULL; i++)
sl@0
   990
    {
sl@0
   991
       if (strcmp(string, wfc_extensions[i])==0)
sl@0
   992
       {
sl@0
   993
           retVal = WFC_TRUE;
sl@0
   994
           break;
sl@0
   995
       }
sl@0
   996
    }
sl@0
   997
sl@0
   998
    SUCCEED(retVal);
sl@0
   999
}
sl@0
  1000
sl@0
  1001
/*=========================================================================*/
sl@0
  1002
/* 11. TEST ONLY API FOR ON SCREEN IMAGE EXPORTING                         */
sl@0
  1003
/*=========================================================================*/
sl@0
  1004
sl@0
  1005
WFC_API_CALL WFCNativeStreamType WFC_APIENTRY
sl@0
  1006
extwfcGetOnScreenStream(WFCDevice dev, WFCContext ctx) WFC_APIEXIT
sl@0
  1007
{
sl@0
  1008
	WFC_DEVICE*             device;
sl@0
  1009
	WFC_CONTEXT*            context;
sl@0
  1010
sl@0
  1011
	GET_DEVICE(device, dev, WFC_INVALID_HANDLE);
sl@0
  1012
	DPRINT(("  device = %p", device));
sl@0
  1013
sl@0
  1014
	GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE);
sl@0
  1015
	DPRINT(("  context = %p", context));
sl@0
  1016
sl@0
  1017
	/* Protect context's target stream from being destroyed by the user
sl@0
  1018
	 * WFC_CONTEXT_Dtor will reset this flag. */
sl@0
  1019
	owfNativeStreamSetProtectionFlag(context->stream, OWF_TRUE);
sl@0
  1020
	
sl@0
  1021
	OWF_DisplayContext_FlagInternalStreamAccessed(context->displayContext);
sl@0
  1022
sl@0
  1023
	SUCCEED(context->stream);
sl@0
  1024
}