sl@0: /* Copyright (c) 2009-2010 The Khronos Group Inc. sl@0: * Portions copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies) sl@0: * sl@0: * Permission is hereby granted, free of charge, to any person obtaining a sl@0: * copy of this software and/or associated documentation files (the sl@0: * "Materials"), to deal in the Materials without restriction, including sl@0: * without limitation the rights to use, copy, modify, merge, publish, sl@0: * distribute, sublicense, and/or sell copies of the Materials, and to sl@0: * permit persons to whom the Materials are furnished to do so, subject to sl@0: * the following conditions: sl@0: * sl@0: * The above copyright notice and this permission notice shall be included sl@0: * in all copies or substantial portions of the Materials. sl@0: * sl@0: * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, sl@0: * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF sl@0: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. sl@0: * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY sl@0: * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, sl@0: * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE sl@0: * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. sl@0: */ sl@0: sl@0: /*! \ingroup wfc sl@0: * \file wfcapi.c sl@0: * \brief OpenWF Composition SI, API implementation. sl@0: * sl@0: * For function documentations, see OpenWF Composition specification 1.0 sl@0: * sl@0: * The general layout of an API function is: sl@0: * - grab API mutex (lock API) sl@0: * - check parameter validity sl@0: * - invoke implementation function (WFD_...) sl@0: * - unlock API sl@0: * - return sl@0: * sl@0: */ sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include sl@0: #include sl@0: sl@0: #include "wfcstructs.h" sl@0: #include "wfccontext.h" sl@0: #include "owfnativestream.h" sl@0: #include "owfscreen.h" sl@0: sl@0: #define RGB_NUM_BYTES (sizeof(WFCuint8) * 4) sl@0: sl@0: #define COND_FAIL(cond,error,retval) \ sl@0: if (!(cond)) { \ sl@0: WFC_Device_SetError(dev, error); \ sl@0: WFC_Unlock(); \ sl@0: return retval; \ sl@0: } sl@0: sl@0: #define COND_FAIL_NR(cond,error) \ sl@0: if (!(cond)) { \ sl@0: WFC_Device_SetError(dev, error); \ sl@0: WFC_Unlock(); \ sl@0: return; \ sl@0: } sl@0: sl@0: #define GET_DEVICE(d, h, x) \ sl@0: WFC_Lock(); \ sl@0: d = WFC_Device_FindByHandle(h); \ sl@0: if (NULL == d) { \ sl@0: WFC_Unlock(); \ sl@0: return x; \ sl@0: } sl@0: sl@0: #define GET_DEVICE_NR(d, h) \ sl@0: WFC_Lock(); \ sl@0: d = WFC_Device_FindByHandle(h); \ sl@0: if (WFC_INVALID_HANDLE == d) { \ sl@0: WFC_Unlock(); \ sl@0: return; \ sl@0: } sl@0: sl@0: #define GET_CONTEXT_NR(c,d,h) \ sl@0: c = WFC_Device_FindContext(d, h); \ sl@0: if (WFC_INVALID_HANDLE == c) { \ sl@0: WFC_Device_SetError((d)->handle, WFC_ERROR_BAD_HANDLE); \ sl@0: WFC_Unlock(); \ sl@0: return; \ sl@0: } sl@0: sl@0: #define GET_CONTEXT(c,d,h,x) \ sl@0: c = WFC_Device_FindContext(d, h); \ sl@0: if (WFC_INVALID_HANDLE == c) { \ sl@0: WFC_Device_SetError((d)->handle, WFC_ERROR_BAD_HANDLE); \ sl@0: WFC_Unlock(); \ sl@0: return x; \ sl@0: } sl@0: sl@0: #define SUCCEED(retval) \ sl@0: WFC_Device_SetError(dev, WFC_ERROR_NONE); \ sl@0: WFC_Unlock(); \ sl@0: return retval sl@0: sl@0: #define SUCCEED_NR() \ sl@0: WFC_Device_SetError(dev, WFC_ERROR_NONE); \ sl@0: WFC_Unlock(); \ sl@0: return sl@0: sl@0: #define FAIL(err, retval) \ sl@0: WFC_Device_SetError(dev, err); \ sl@0: WFC_Unlock(); \ sl@0: return retval sl@0: sl@0: #define FAIL_NR(err) \ sl@0: WFC_Device_SetError(dev, err); \ sl@0: WFC_Unlock(); \ sl@0: return sl@0: sl@0: sl@0: static OWF_MUTEX mutex; sl@0: sl@0: static void WFC_Cleanup() sl@0: { sl@0: OWF_Mutex_Destroy(&mutex); sl@0: } sl@0: sl@0: static void WFC_Lock() sl@0: { sl@0: if (!mutex) sl@0: { sl@0: OWF_Mutex_Init(&mutex); sl@0: xatexit(WFC_Cleanup); // Use adaptation version of atexit sl@0: } sl@0: OWF_Mutex_Lock(&mutex); sl@0: } sl@0: sl@0: static void WFC_Unlock() sl@0: { sl@0: OWF_Mutex_Unlock(&mutex); sl@0: } sl@0: sl@0: /*=========================================================================*/ sl@0: /* 4. DEVICE */ sl@0: /*=========================================================================*/ sl@0: sl@0: WFC_API_CALL WFCint WFC_APIENTRY sl@0: wfcEnumerateDevices(WFCint *deviceIds, sl@0: WFCint deviceIdsCount, sl@0: const WFCint *filterList) sl@0: { sl@0: WFCint n; sl@0: sl@0: /* populate list with device IDs */ sl@0: n = WFC_Devices_GetIds(deviceIds, deviceIdsCount, filterList); sl@0: return n; sl@0: } sl@0: sl@0: WFC_API_CALL WFCDevice WFC_APIENTRY sl@0: wfcCreateDevice(WFCint deviceId, const WFCint *attribList) sl@0: { sl@0: WFCDevice device; sl@0: sl@0: /* currently only empty attribute list or NULL is allowed */ sl@0: if (attribList && *attribList != WFC_NONE) sl@0: { sl@0: sl@0: return WFC_INVALID_HANDLE; sl@0: } sl@0: WFC_Lock(); sl@0: device = WFC_Device_Create(deviceId); sl@0: WFC_Unlock(); sl@0: sl@0: return device; sl@0: } sl@0: sl@0: WFC_API_CALL WFCErrorCode WFC_APIENTRY sl@0: wfcDestroyDevice(WFCDevice dev) sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFCErrorCode result = WFC_ERROR_BAD_DEVICE; sl@0: sl@0: DPRINT(("wfcDestroyDevice(%d)", dev)); sl@0: sl@0: WFC_Lock(); sl@0: device = WFC_Device_FindByHandle(dev); sl@0: if (device) sl@0: { sl@0: WFC_Device_Destroy(device); sl@0: result = WFC_ERROR_NONE; sl@0: } sl@0: WFC_Unlock(); sl@0: return result; sl@0: } sl@0: sl@0: WFC_API_CALL WFCint WFC_APIENTRY sl@0: wfcGetDeviceAttribi(WFCDevice dev, sl@0: WFCDeviceAttrib attrib) sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFCint result = 0; sl@0: WFCErrorCode err; sl@0: sl@0: GET_DEVICE(device, dev, 0); sl@0: err = WFC_Device_GetAttribi(device, attrib, &result); sl@0: sl@0: FAIL(err, result); sl@0: } sl@0: sl@0: WFC_API_CALL WFCErrorCode WFC_APIENTRY sl@0: wfcGetError(WFCDevice dev) sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFCErrorCode err; sl@0: sl@0: GET_DEVICE(device, dev, WFC_ERROR_BAD_DEVICE); sl@0: sl@0: err = WFC_Device_GetError(device); sl@0: WFC_Unlock(); sl@0: return err; sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcCommit(WFCDevice dev, WFCContext ctx, WFCboolean wait) sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: WFCErrorCode error; sl@0: sl@0: DPRINT(("wfcCommit(%d,%d,%d)", dev, ctx, wait)); sl@0: GET_DEVICE_NR(device, dev); sl@0: GET_CONTEXT_NR(context, device, ctx); sl@0: sl@0: error = WFC_Context_InvokeCommit(device, context, wait); sl@0: sl@0: FAIL_NR(error); sl@0: } sl@0: sl@0: /*=========================================================================*/ sl@0: /* 5. CONTEXT */ sl@0: /*=========================================================================*/ sl@0: sl@0: WFC_API_CALL WFCContext WFC_APIENTRY sl@0: wfcCreateOnScreenContext(WFCDevice dev, sl@0: WFCint screenNumber, sl@0: const WFCint* attribList) sl@0: { sl@0: WFC_CONTEXT* context = NULL; sl@0: WFC_DEVICE* device = NULL; sl@0: sl@0: GET_DEVICE(device, dev, WFC_INVALID_HANDLE); sl@0: sl@0: /* currently only empty attribute list or NULL is allowed */ sl@0: COND_FAIL(!(attribList && *attribList != WFC_NONE), sl@0: WFC_ERROR_BAD_ATTRIBUTE, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: if (screenNumber == WFC_DEFAULT_SCREEN_NUMBER) sl@0: { sl@0: screenNumber = OWF_Screen_GetDefaultNumber(); sl@0: } sl@0: sl@0: /* check screen number validity */ sl@0: if (!OWF_Screen_Valid(screenNumber)) sl@0: { sl@0: FAIL(WFC_ERROR_UNSUPPORTED, WFC_INVALID_HANDLE); sl@0: } sl@0: sl@0: /* check that no other context currently uses this screen */ sl@0: if (WFC_Device_FindScreenNumber(screenNumber)) sl@0: { sl@0: FAIL(WFC_ERROR_IN_USE, WFC_INVALID_HANDLE); sl@0: } sl@0: sl@0: sl@0: context = WFC_Device_CreateContext(device, sl@0: WFC_INVALID_HANDLE, sl@0: WFC_CONTEXT_TYPE_ON_SCREEN, sl@0: screenNumber); sl@0: if (!context) sl@0: { sl@0: FAIL(WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE); sl@0: } sl@0: sl@0: SUCCEED(context->handle); sl@0: } sl@0: sl@0: WFC_API_CALL WFCContext WFC_APIENTRY sl@0: wfcCreateOffScreenContext(WFCDevice dev, sl@0: WFCNativeStreamType stream, sl@0: const WFCint *attribList) sl@0: { sl@0: WFC_CONTEXT* context = NULL; sl@0: WFC_DEVICE* device = NULL; sl@0: OWFNativeStreamType internalStream=OWF_INVALID_HANDLE; sl@0: OWF_STREAM_ERROR streamError; sl@0: sl@0: GET_DEVICE(device, dev, WFC_INVALID_HANDLE); sl@0: sl@0: /* currently only empty attribute list or NULL is allowed */ sl@0: COND_FAIL(!(attribList && *attribList != WFC_NONE), sl@0: WFC_ERROR_BAD_ATTRIBUTE, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream, sl@0: WFC_ERROR_ILLEGAL_ARGUMENT, sl@0: WFC_INVALID_HANDLE); sl@0: internalStream=owfNativeStreamFromWFC(stream,&streamError); sl@0: COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE); sl@0: COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE); sl@0: sl@0: if (!WFC_Context_IsValidTargetStream(internalStream)) sl@0: { sl@0: owfNativeStreamDestroy(internalStream); /*cancel owfNativeStreamFromWFC reference increase*/ sl@0: FAIL(WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE); sl@0: } sl@0: context = WFC_Device_CreateContext(device, internalStream, sl@0: WFC_CONTEXT_TYPE_OFF_SCREEN, sl@0: OWF_RESERVED_BAD_SCREEN_NUMBER); sl@0: owfNativeStreamDestroy(internalStream); /*cancel owfNativeStreamFromWFC reference increase*/ sl@0: COND_FAIL(NULL != context, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE); sl@0: sl@0: SUCCEED(context->handle); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcDestroyContext(WFCDevice dev, sl@0: WFCContext ctx) sl@0: { sl@0: WFC_DEVICE* device = NULL; sl@0: WFCErrorCode err; sl@0: sl@0: DPRINT(("wfcDestroyContext(%d, %d)", dev, ctx)); sl@0: GET_DEVICE_NR(device, dev); sl@0: sl@0: err = WFC_Device_DestroyContext(device, ctx); sl@0: FAIL_NR(err); sl@0: } sl@0: sl@0: WFC_API_CALL WFCint WFC_APIENTRY sl@0: wfcGetContextAttribi(WFCDevice dev, sl@0: WFCContext ctx, sl@0: WFCContextAttrib attrib) sl@0: { sl@0: WFC_CONTEXT* context = NULL; sl@0: WFC_DEVICE* device = NULL; sl@0: WFCint value = 0; sl@0: WFCErrorCode err; sl@0: sl@0: GET_DEVICE(device, dev, 0); sl@0: GET_CONTEXT(context, device, ctx, 0); sl@0: sl@0: err = WFC_Context_GetAttribi(context, attrib, &value); sl@0: sl@0: FAIL(err, value); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcSetContextAttribi(WFCDevice dev, sl@0: WFCContext ctx, sl@0: WFCContextAttrib attrib, sl@0: WFCint value) sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: WFCErrorCode err; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: GET_CONTEXT_NR(context, device, ctx); sl@0: sl@0: err = WFC_Context_SetAttribi(context, attrib, value); sl@0: FAIL_NR(err); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcGetContextAttribfv(WFCDevice dev, sl@0: WFCContext ctx, sl@0: WFCContextAttrib attrib, sl@0: WFCint count, sl@0: WFCfloat *values) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: WFCErrorCode err; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: GET_CONTEXT_NR(context, device, ctx); sl@0: sl@0: err = WFC_Context_GetAttribfv(context, attrib, count, values); sl@0: FAIL_NR(err); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcSetContextAttribfv(WFCDevice dev, sl@0: WFCContext ctx, sl@0: WFCContextAttrib attrib, sl@0: WFCint count, sl@0: const WFCfloat *values) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: WFCErrorCode err; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: GET_CONTEXT_NR(context, device, ctx); sl@0: sl@0: err = WFC_Context_SetAttribfv(context, attrib, count, values); sl@0: FAIL_NR(err); sl@0: } sl@0: sl@0: /*=========================================================================*/ sl@0: /* 6. IMAGE PROVIDERS (SOURCES & MASKS) */ sl@0: /*=========================================================================*/ sl@0: sl@0: WFC_API_CALL WFCSource WFC_APIENTRY sl@0: wfcCreateSourceFromStream(WFCDevice dev, sl@0: WFCContext ctx, sl@0: WFCNativeStreamType stream, sl@0: const WFCint *attribList) sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_IMAGE_PROVIDER* source; sl@0: WFC_CONTEXT* context; sl@0: OWFNativeStreamType internalStream=OWF_INVALID_HANDLE; sl@0: OWF_STREAM_ERROR streamError; sl@0: sl@0: GET_DEVICE(device, dev, WFC_INVALID_HANDLE); sl@0: sl@0: /* currently only empty attribute list or NULL is allowed */ sl@0: COND_FAIL(!(attribList && *attribList != WFC_NONE), sl@0: WFC_ERROR_BAD_ATTRIBUTE, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE); sl@0: COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream, sl@0: WFC_ERROR_ILLEGAL_ARGUMENT, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: internalStream=owfNativeStreamFromWFC(stream,&streamError); sl@0: COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE); sl@0: COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE); sl@0: sl@0: if (context->stream == internalStream) sl@0: { sl@0: owfNativeStreamDestroy(internalStream); sl@0: FAIL( WFC_ERROR_IN_USE, WFC_INVALID_HANDLE); sl@0: } sl@0: sl@0: if (!WFC_Context_IsValidSourceStream(internalStream)) sl@0: { sl@0: owfNativeStreamDestroy(internalStream); sl@0: FAIL( WFC_ERROR_UNSUPPORTED, WFC_INVALID_HANDLE); sl@0: } sl@0: sl@0: source = WFC_Device_CreateSource(device, context, internalStream); sl@0: owfNativeStreamDestroy(internalStream); /*cancel FromWFC reference increase*/ sl@0: COND_FAIL(NULL != source, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE); sl@0: sl@0: SUCCEED(source->handle); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcDestroySource(WFCDevice dev, sl@0: WFCSource src) sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFCErrorCode err; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: sl@0: err = WFC_Device_DestroySource(device, src); sl@0: sl@0: FAIL_NR(err); sl@0: } sl@0: sl@0: WFC_API_CALL WFCMask WFC_APIENTRY sl@0: wfcCreateMaskFromStream(WFCDevice dev, sl@0: WFCContext ctx, sl@0: WFCNativeStreamType stream, sl@0: const WFCint *attribList) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: WFC_IMAGE_PROVIDER* mask; sl@0: WFCboolean inUse; sl@0: OWFNativeStreamType internalStream=OWF_INVALID_HANDLE; sl@0: OWF_STREAM_ERROR streamError; sl@0: sl@0: sl@0: GET_DEVICE(device, dev, WFC_ERROR_BAD_DEVICE); sl@0: sl@0: /* currently only empty attribute list or NULL is allowed */ sl@0: COND_FAIL(!(attribList && *attribList != WFC_NONE), sl@0: WFC_ERROR_BAD_ATTRIBUTE, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE); sl@0: COND_FAIL(OWF_INVALID_HANDLE != (OWFNativeStreamType) stream, sl@0: WFC_ERROR_ILLEGAL_ARGUMENT, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: internalStream=owfNativeStreamFromWFC(stream,&streamError); sl@0: COND_FAIL(OWF_STREAM_ERROR_INVALID_STREAM!=streamError,WFC_ERROR_UNSUPPORTED,WFC_INVALID_HANDLE); sl@0: COND_FAIL(OWF_STREAM_ERROR_OUT_OF_MEMORY!=streamError,WFC_ERROR_OUT_OF_MEMORY,WFC_INVALID_HANDLE); sl@0: sl@0: inUse = WFC_Device_StreamIsTarget(device, internalStream); sl@0: if (inUse) sl@0: { sl@0: owfNativeStreamDestroy(internalStream); sl@0: FAIL( WFC_ERROR_IN_USE, WFC_INVALID_HANDLE); sl@0: } sl@0: sl@0: mask = WFC_Device_CreateMask(device, context, internalStream); sl@0: owfNativeStreamDestroy(internalStream); /*cancel FromWFC reference increase*/ sl@0: COND_FAIL(NULL != mask, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE); sl@0: sl@0: SUCCEED(mask->handle); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcDestroyMask(WFCDevice dev, sl@0: WFCMask mask) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFCErrorCode error; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: sl@0: error = WFC_Device_DestroyMask(device, mask); sl@0: sl@0: FAIL_NR(error); sl@0: } sl@0: sl@0: /*=========================================================================*/ sl@0: /* 7. COMPOSITION ELEMENTS */ sl@0: /*=========================================================================*/ sl@0: sl@0: WFC_API_CALL WFCElement WFC_APIENTRY sl@0: wfcCreateElement(WFCDevice dev, sl@0: WFCContext ctx, sl@0: const WFCint* attribList) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_ELEMENT* element; sl@0: WFC_CONTEXT* context; sl@0: sl@0: GET_DEVICE(device, dev, WFC_INVALID_HANDLE); sl@0: sl@0: /* currently only empty attribute list or NULL is allowed */ sl@0: COND_FAIL(!(attribList && *attribList != WFC_NONE), sl@0: WFC_ERROR_BAD_ATTRIBUTE, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: GET_CONTEXT(context, device, ctx, WFC_INVALID_HANDLE); sl@0: sl@0: element = WFC_Device_CreateElement(device, context); sl@0: COND_FAIL(NULL != element, WFC_ERROR_OUT_OF_MEMORY, WFC_INVALID_HANDLE); sl@0: sl@0: SUCCEED(element->handle); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcDestroyElement(WFCDevice dev, sl@0: WFCElement element) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFCErrorCode error = WFC_ERROR_BAD_HANDLE; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: sl@0: error = WFC_Device_DestroyElement(device, element); sl@0: sl@0: FAIL_NR(error); sl@0: } sl@0: sl@0: #define ATTR_FUNC_PROLOGUE \ sl@0: WFCErrorCode error; \ sl@0: WFC_DEVICE* device; \ sl@0: \ sl@0: GET_DEVICE(device, dev, 0) sl@0: sl@0: #define ATTR_FUNC_PROLOGUE_NR \ sl@0: WFCErrorCode error; \ sl@0: WFC_DEVICE* device; \ sl@0: \ sl@0: GET_DEVICE_NR(device, dev) sl@0: sl@0: #define ATTR_FUNC_EPILOGUE(x) \ sl@0: FAIL(error, x) sl@0: sl@0: #define ATTR_FUNC_EPILOGUE_NR \ sl@0: FAIL_NR(error) sl@0: sl@0: WFC_API_CALL WFCint WFC_APIENTRY sl@0: wfcGetElementAttribi(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElementAttrib attrib) WFC_APIEXIT sl@0: { sl@0: WFCint value; sl@0: sl@0: ATTR_FUNC_PROLOGUE; sl@0: sl@0: error = WFC_Device_GetElementAttribiv(device, element, attrib, 1, &value); sl@0: sl@0: ATTR_FUNC_EPILOGUE(value); sl@0: } sl@0: sl@0: WFC_API_CALL WFCfloat WFC_APIENTRY sl@0: wfcGetElementAttribf(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElementAttrib attrib) WFC_APIEXIT sl@0: { sl@0: WFCfloat value; sl@0: sl@0: ATTR_FUNC_PROLOGUE; sl@0: sl@0: COND_FAIL(WFC_ELEMENT_GLOBAL_ALPHA == attrib, sl@0: WFC_ERROR_BAD_ATTRIBUTE, sl@0: 0.0f); sl@0: sl@0: error = WFC_Device_GetElementAttribfv(device, element, attrib, 1, &value); sl@0: sl@0: /* value is [0, OWF_ALPHA_MAX_VALUE], map to [0, 1] */ sl@0: value = value / OWF_ALPHA_MAX_VALUE; sl@0: sl@0: ATTR_FUNC_EPILOGUE(value); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcGetElementAttribiv(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElementAttrib attrib, sl@0: WFCint count, sl@0: WFCint *values) WFC_APIEXIT sl@0: { sl@0: ATTR_FUNC_PROLOGUE_NR; sl@0: sl@0: COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib || sl@0: WFC_ELEMENT_DESTINATION_RECTANGLE == attrib, sl@0: WFC_ERROR_BAD_ATTRIBUTE); sl@0: sl@0: error = WFC_Device_GetElementAttribiv(device, element, attrib, count, sl@0: values); sl@0: ATTR_FUNC_EPILOGUE_NR; sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcGetElementAttribfv(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElementAttrib attrib, sl@0: WFCint count, sl@0: WFCfloat *values) WFC_APIEXIT sl@0: { sl@0: ATTR_FUNC_PROLOGUE_NR; sl@0: sl@0: COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib || sl@0: WFC_ELEMENT_DESTINATION_RECTANGLE == attrib, sl@0: WFC_ERROR_BAD_ATTRIBUTE); sl@0: sl@0: error = WFC_Device_GetElementAttribfv(device, element, attrib, count, sl@0: values); sl@0: sl@0: ATTR_FUNC_EPILOGUE_NR; sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcSetElementAttribi(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElementAttrib attrib, sl@0: WFCint value) WFC_APIEXIT sl@0: { sl@0: ATTR_FUNC_PROLOGUE_NR; sl@0: sl@0: error = WFC_Device_SetElementAttribiv(device, element, attrib, 1, &value); sl@0: sl@0: ATTR_FUNC_EPILOGUE_NR; sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcSetElementAttribf(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElementAttrib attrib, sl@0: WFCfloat value) WFC_APIEXIT sl@0: { sl@0: ATTR_FUNC_PROLOGUE_NR; sl@0: sl@0: COND_FAIL_NR(WFC_ELEMENT_GLOBAL_ALPHA == attrib, sl@0: WFC_ERROR_BAD_ATTRIBUTE); sl@0: sl@0: error = WFC_Device_SetElementAttribfv(device, element, attrib, 1, &value); sl@0: sl@0: ATTR_FUNC_EPILOGUE_NR; sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcSetElementAttribiv(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElementAttrib attrib, sl@0: WFCint count, sl@0: const WFCint *values) WFC_APIEXIT sl@0: { sl@0: ATTR_FUNC_PROLOGUE_NR; sl@0: sl@0: COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib || sl@0: WFC_ELEMENT_DESTINATION_RECTANGLE == attrib, sl@0: WFC_ERROR_BAD_ATTRIBUTE); sl@0: sl@0: error = WFC_Device_SetElementAttribiv(device, element, attrib, count, sl@0: values); sl@0: sl@0: ATTR_FUNC_EPILOGUE_NR; sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcSetElementAttribfv(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElementAttrib attrib, sl@0: WFCint count, sl@0: const WFCfloat *values) WFC_APIEXIT sl@0: { sl@0: ATTR_FUNC_PROLOGUE_NR; sl@0: sl@0: COND_FAIL_NR(WFC_ELEMENT_SOURCE_RECTANGLE == attrib || sl@0: WFC_ELEMENT_DESTINATION_RECTANGLE == attrib, sl@0: WFC_ERROR_BAD_ATTRIBUTE); sl@0: sl@0: error = WFC_Device_SetElementAttribfv(device, element, attrib, count, sl@0: values); sl@0: sl@0: ATTR_FUNC_EPILOGUE_NR; sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcInsertElement(WFCDevice dev, sl@0: WFCElement element, sl@0: WFCElement subordinate) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_ELEMENT* elemento; sl@0: WFCErrorCode error; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: sl@0: /* sl@0: - element is inserted immediately above subordinate sl@0: - if subordinate is NULL, then element will go to bottom sl@0: - both elements must be in the same scene (context) sl@0: */ sl@0: elemento = WFC_Device_FindElement(device, element); sl@0: COND_FAIL_NR(WFC_INVALID_HANDLE != elemento, WFC_ERROR_BAD_HANDLE); sl@0: sl@0: error = WFC_Context_InsertElement(CONTEXT(elemento->context), sl@0: element, sl@0: subordinate); sl@0: sl@0: FAIL_NR(error); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcRemoveElement(WFCDevice dev, sl@0: WFCElement element) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_ELEMENT* elemento; sl@0: WFCErrorCode error; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: sl@0: elemento = WFC_Device_FindElement(device, element); sl@0: COND_FAIL_NR(WFC_INVALID_HANDLE != elemento, WFC_ERROR_BAD_HANDLE); sl@0: sl@0: error = WFC_Context_RemoveElement(CONTEXT(elemento->context), element); sl@0: sl@0: FAIL_NR(error); sl@0: } sl@0: sl@0: WFC_API_CALL WFCElement WFC_APIENTRY sl@0: wfcGetElementAbove(WFCDevice dev, WFCElement element) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device = NULL; sl@0: WFC_ELEMENT* elemento = NULL; sl@0: WFCElement result = WFC_INVALID_HANDLE; sl@0: WFCErrorCode error = WFC_ERROR_NONE; sl@0: sl@0: GET_DEVICE(device, dev, WFC_INVALID_HANDLE); sl@0: sl@0: elemento = WFC_Device_FindElement(device, element); sl@0: COND_FAIL(WFC_INVALID_HANDLE != elemento, sl@0: WFC_ERROR_BAD_HANDLE, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: error = WFC_Context_GetElementAbove(CONTEXT(elemento->context), sl@0: element, sl@0: &result); sl@0: sl@0: FAIL(error, result); sl@0: } sl@0: sl@0: WFC_API_CALL WFCElement WFC_APIENTRY sl@0: wfcGetElementBelow(WFCDevice dev, WFCElement element) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device = NULL; sl@0: WFC_ELEMENT* elemento = NULL; sl@0: WFCElement result = WFC_INVALID_HANDLE; sl@0: WFCErrorCode error = WFC_ERROR_NONE; sl@0: sl@0: GET_DEVICE(device, dev, WFC_INVALID_HANDLE); sl@0: sl@0: elemento = WFC_Device_FindElement(device, element); sl@0: COND_FAIL(WFC_INVALID_HANDLE != elemento, sl@0: WFC_ERROR_BAD_HANDLE, sl@0: WFC_INVALID_HANDLE); sl@0: sl@0: error = WFC_Context_GetElementBelow(CONTEXT(elemento->context), sl@0: element, sl@0: &result); sl@0: sl@0: FAIL(error, result); sl@0: } sl@0: sl@0: /*=========================================================================*/ sl@0: /* 8. RENDERING */ sl@0: /*=========================================================================*/ sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcActivate(WFCDevice dev, sl@0: WFCContext ctx) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: GET_CONTEXT_NR(context, device, ctx); sl@0: sl@0: WFC_Context_Activate(context, WFC_TRUE); sl@0: sl@0: SUCCEED_NR(); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcDeactivate(WFCDevice dev, sl@0: WFCContext ctx) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: GET_CONTEXT_NR(context, device, ctx); sl@0: sl@0: WFC_Context_Activate(context, WFC_FALSE); sl@0: sl@0: SUCCEED_NR(); sl@0: } sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcCompose(WFCDevice dev, sl@0: WFCContext ctx, sl@0: WFCboolean wait) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: WFCboolean able; sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: GET_CONTEXT_NR(context, device, ctx); sl@0: sl@0: /* context must not be active */ sl@0: COND_FAIL_NR(!WFC_Context_Active(context), WFC_ERROR_UNSUPPORTED); sl@0: sl@0: /* send composition request */ sl@0: able = WFC_Context_InvokeComposition(device, context, wait); sl@0: COND_FAIL_NR(WFC_TRUE == able, WFC_ERROR_BUSY); sl@0: sl@0: SUCCEED_NR(); sl@0: } sl@0: sl@0: sl@0: /*=========================================================================*/ sl@0: /* 9. SYNCHRONIZATION */ sl@0: /*=========================================================================*/ sl@0: sl@0: WFC_API_CALL void WFC_APIENTRY sl@0: wfcFence(WFCDevice dev, sl@0: WFCContext ctx, sl@0: WFCEGLDisplay dpy, sl@0: WFCEGLSync sync) sl@0: { sl@0: WFC_DEVICE* device; sl@0: WFC_CONTEXT* context; sl@0: sl@0: DPRINT(("wfcFence(%08x,%08x,%08x)", dev, ctx, sync)); sl@0: sl@0: GET_DEVICE_NR(device, dev); sl@0: DPRINT((" device = %p", device)); sl@0: sl@0: GET_CONTEXT_NR(context, device, ctx); sl@0: DPRINT((" context = %p", context)); sl@0: sl@0: /* unsignal sync object first */ sl@0: OWF_ASSERT(context->eglPrivateSignalSync); sl@0: if ( !(context->eglPrivateSignalSync((EGLDisplay)dpy, sync, EGL_UNSIGNALED_KHR)) ) sl@0: { sl@0: FAIL_NR(WFC_ERROR_ILLEGAL_ARGUMENT); sl@0: } sl@0: sl@0: /* insert fence 'token' to command stream */ sl@0: WFC_Context_InsertFence(context, dpy, sync); sl@0: SUCCEED_NR(); sl@0: } sl@0: sl@0: /*=========================================================================*/ sl@0: /* 10. EXTENSION SUPPORT */ sl@0: /*=========================================================================*/ sl@0: sl@0: WFC_API_CALL WFCint WFC_APIENTRY sl@0: wfcGetStrings(WFCDevice dev, sl@0: WFCStringID name, sl@0: const char **strings, sl@0: WFCint stringsCount) WFC_APIEXIT sl@0: { sl@0: WFC_DEVICE* pDevice; sl@0: const char** tmp; sl@0: WFCint retVal; sl@0: sl@0: GET_DEVICE(pDevice, dev, 0); sl@0: COND_FAIL(stringsCount >= 0, WFC_ERROR_ILLEGAL_ARGUMENT, 0); sl@0: sl@0: switch (name) sl@0: { sl@0: case WFC_VENDOR: sl@0: retVal = 1; sl@0: tmp = &wfc_strings[WFC_VENDOR_INDEX]; sl@0: break; sl@0: sl@0: case WFC_RENDERER: sl@0: retVal = 1; sl@0: tmp = &wfc_strings[WFC_RENDERER_INDEX]; sl@0: break; sl@0: sl@0: case WFC_VERSION: sl@0: retVal = 1; sl@0: tmp = &wfc_strings[WFC_VERSION_INDEX]; sl@0: break; sl@0: sl@0: case WFC_EXTENSIONS: sl@0: tmp = &wfc_extensions[0]; sl@0: /* we know that wfc_extensions always has NULL as the last member sl@0: so this loop will never exceed the size of tmp */ sl@0: /* coverity[overrun-local] */ sl@0: for (retVal=0; tmp[retVal] != NULL; retVal++) sl@0: { sl@0: /* get extensions array size */ sl@0: } sl@0: break; sl@0: sl@0: default: sl@0: FAIL(WFC_ERROR_ILLEGAL_ARGUMENT, 0); sl@0: } sl@0: sl@0: if (strings != NULL) sl@0: { sl@0: WFCint i; sl@0: sl@0: if (stringsCount < retVal) sl@0: { sl@0: retVal = stringsCount; sl@0: } sl@0: for (i=0; istream, OWF_TRUE); sl@0: sl@0: OWF_DisplayContext_FlagInternalStreamAccessed(context->displayContext); sl@0: sl@0: SUCCEED(context->stream); sl@0: }