os/graphics/graphicscomposition/openwfsupport/src/openwfcstream.cpp
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 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
// openwfcstream.cpp
sl@0
    15
// C API for surface stream implementation of OpenWF-C NativeStream 
sl@0
    16
//
sl@0
    17
sl@0
    18
sl@0
    19
//  Include Files  
sl@0
    20
#include <e32def.h>
sl@0
    21
#include <pixelformats.h>
sl@0
    22
#include <graphics/suerror.h>
sl@0
    23
#include "symbianstream.h"
sl@0
    24
#include "surfacestream.h"
sl@0
    25
#include "streammap.h"
sl@0
    26
#include "openwfcpanic.h"
sl@0
    27
sl@0
    28
sl@0
    29
extern "C"{
sl@0
    30
sl@0
    31
EXPORT_C TErrCode SymbianStreamAcquire( const TSurfaceId* aId, SymbianStreamType* aReturnStream)
sl@0
    32
	{
sl@0
    33
	if (aId && !aId->IsNull())
sl@0
    34
		{
sl@0
    35
        CSurfaceStream* stream = NULL;
sl@0
    36
        if (aId->Type()==TSurfaceId::EStreamHandle)
sl@0
    37
            {
sl@0
    38
            stream=CSurfaceStream::FromHandle(aId);
sl@0
    39
            __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamUnexpectedError));
sl@0
    40
            stream->AddReference();
sl@0
    41
            *aReturnStream= stream->ToHandle();
sl@0
    42
            return KErrNone;
sl@0
    43
            }
sl@0
    44
        else
sl@0
    45
            {
sl@0
    46
            TRAPD(err,stream = COpenWfcStreamMap::InstanceL().AcquireL(*aId));
sl@0
    47
            if (stream)
sl@0
    48
                {
sl@0
    49
                *aReturnStream = stream->ToHandle();
sl@0
    50
                return KErrNone;
sl@0
    51
                }
sl@0
    52
            else
sl@0
    53
                {
sl@0
    54
                return err;
sl@0
    55
                }
sl@0
    56
            }
sl@0
    57
		}
sl@0
    58
	else
sl@0
    59
		{
sl@0
    60
		*aReturnStream = NULL;
sl@0
    61
		return KErrBadHandle;
sl@0
    62
		}	
sl@0
    63
	}
sl@0
    64
sl@0
    65
EXPORT_C TErrCode SymbianStreamFind( const TSurfaceId* aId, SymbianStreamType* aReturnStream)
sl@0
    66
	{
sl@0
    67
	if (aId && !aId->IsNull())
sl@0
    68
		{
sl@0
    69
        CSurfaceStream* stream=NULL;
sl@0
    70
        if (aId->Type()==TSurfaceId::EStreamHandle)
sl@0
    71
            {
sl@0
    72
            stream=CSurfaceStream::FromHandle(aId);
sl@0
    73
            __ASSERT_DEBUG(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
    74
            stream->AddReference();
sl@0
    75
            *aReturnStream= stream->ToHandle();
sl@0
    76
            return KErrNone;
sl@0
    77
            }
sl@0
    78
        else
sl@0
    79
            {
sl@0
    80
            TRAPD(err,stream = COpenWfcStreamMap::InstanceL().Find(*aId));
sl@0
    81
            if (stream)
sl@0
    82
                {
sl@0
    83
                *aReturnStream = stream->ToHandle();
sl@0
    84
                return KErrNone;
sl@0
    85
                }
sl@0
    86
            else
sl@0
    87
                {
sl@0
    88
                *aReturnStream = NULL;
sl@0
    89
                if (err==KErrNone)
sl@0
    90
                    {
sl@0
    91
                    return KErrNotFound;
sl@0
    92
                    }
sl@0
    93
                else
sl@0
    94
                    {
sl@0
    95
                    return err;
sl@0
    96
                    }
sl@0
    97
                }
sl@0
    98
            }
sl@0
    99
        }
sl@0
   100
	else
sl@0
   101
		{
sl@0
   102
		*aReturnStream = NULL;
sl@0
   103
		return KErrBadHandle;
sl@0
   104
		}	
sl@0
   105
	}
sl@0
   106
sl@0
   107
EXPORT_C void SymbianStreamAddReference(SymbianStreamType aStream)
sl@0
   108
	{
sl@0
   109
	CSurfaceStream*	sstream=CSurfaceStream::FromHandle(aStream);
sl@0
   110
	if (sstream)
sl@0
   111
		{
sl@0
   112
		sstream->AddReference();
sl@0
   113
		}
sl@0
   114
	}
sl@0
   115
sl@0
   116
EXPORT_C TErrCode SymbianStreamGetBufferId( SymbianStreamType aStream, 
sl@0
   117
                        SymbianStreamBuffer aBufferHandle, 
sl@0
   118
                        khronos_int32_t* aReturnIndex, 
sl@0
   119
                        const TSurfaceId** aReturnSurface)
sl@0
   120
	{
sl@0
   121
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   122
    __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
   123
    if (aReturnIndex)
sl@0
   124
        {
sl@0
   125
        *aReturnIndex=stream->BufferHandleToIndex(aBufferHandle);
sl@0
   126
        *aReturnSurface = &stream->SurfaceId();
sl@0
   127
        }
sl@0
   128
    return KErrNone;
sl@0
   129
	}
sl@0
   130
sl@0
   131
EXPORT_C void SymbianStreamRemoveReference(SymbianStreamType aStream)
sl@0
   132
	{
sl@0
   133
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   134
    __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
   135
    stream->ReleaseReference();
sl@0
   136
	}
sl@0
   137
EXPORT_C void SymbianStreamGetHeader( SymbianStreamType aStream,
sl@0
   138
                            khronos_int32_t* aWidth, 
sl@0
   139
                            khronos_int32_t* aHeight, 
sl@0
   140
                            khronos_int32_t* aStride, 
sl@0
   141
                            khronos_int32_t* aFormat, 
sl@0
   142
                            khronos_int32_t* aPixelSize)
sl@0
   143
	{
sl@0
   144
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   145
    __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
   146
    stream->GetHeader(aWidth,aHeight,aStride,aFormat,aPixelSize);
sl@0
   147
	}
sl@0
   148
sl@0
   149
EXPORT_C TErrCode SymbianStreamAcquireReadBuffer( SymbianStreamType aStream, SymbianStreamBuffer* aReturnBuffer)
sl@0
   150
	{
sl@0
   151
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   152
    __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
   153
    *aReturnBuffer = stream->AcquireReadBuffer();
sl@0
   154
    return KErrNone;
sl@0
   155
	}
sl@0
   156
EXPORT_C TErrCode SymbianStreamReleaseReadBuffer( SymbianStreamType aStream, 
sl@0
   157
                                                    SymbianStreamBuffer aBuffer)
sl@0
   158
	{
sl@0
   159
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   160
    __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
   161
    return stream->ReleaseReadBuffer(aBuffer);
sl@0
   162
	}
sl@0
   163
sl@0
   164
EXPORT_C TErrCode SymbianStreamAcquireWriteBuffer( SymbianStreamType aStream, SymbianStreamBuffer* aReturnBuffer)
sl@0
   165
	{
sl@0
   166
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   167
    __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
   168
    *aReturnBuffer = stream->AcquireWriteBuffer();
sl@0
   169
    if (*aReturnBuffer != NULL)
sl@0
   170
        {
sl@0
   171
        return KErrNone;
sl@0
   172
        }
sl@0
   173
    else 
sl@0
   174
        {
sl@0
   175
        return KErrInUse;
sl@0
   176
        }
sl@0
   177
	}
sl@0
   178
sl@0
   179
EXPORT_C TErrCode SymbianStreamReleaseWriteBuffer( SymbianStreamType aStream, 
sl@0
   180
                                                    SymbianStreamBuffer aBuffer)
sl@0
   181
	{
sl@0
   182
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   183
    __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
   184
    stream->ReleaseWriteBuffer(aBuffer);
sl@0
   185
    return KErrNone;
sl@0
   186
	}
sl@0
   187
sl@0
   188
EXPORT_C TErrCode SymbianStreamAddObserver( SymbianStreamType aStream, 
sl@0
   189
                            SymbianStreamCallback aObserver, 
sl@0
   190
                            void* aData)
sl@0
   191
	{
sl@0
   192
    CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
sl@0
   193
    if (stream && aObserver)
sl@0
   194
        {
sl@0
   195
        SYMOWF_DEFAULT_EVENT_PARAM eventPar;
sl@0
   196
        eventPar.length = sizeof(eventPar);
sl@0
   197
        eventPar.event = ESOWF_NoEvent;
sl@0
   198
        aObserver(SYMBIAN_INVALID_HANDLE, ESOWF_ObserverReturnDefaultEvent, NULL, &eventPar);
sl@0
   199
        return stream->AddObserver(aObserver, eventPar.event, KNoAssociatedScreenNumber, aData);
sl@0
   200
        }
sl@0
   201
    return KErrBadHandle;
sl@0
   202
	}
sl@0
   203
sl@0
   204
EXPORT_C TErrCode SymbianStreamRemoveObserver( SymbianStreamType aStream, 
sl@0
   205
                                                void* aData, 
sl@0
   206
                                                SymbianStreamEventBits aEvents)
sl@0
   207
    {
sl@0
   208
    CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
sl@0
   209
    if (stream)
sl@0
   210
        {
sl@0
   211
            return stream->RemoveObserver(aEvents, aData);
sl@0
   212
        }
sl@0
   213
    return KErrBadHandle;
sl@0
   214
    }
sl@0
   215
sl@0
   216
sl@0
   217
EXPORT_C TErrCode SymbianStreamGetBufferPointer( SymbianStreamType aStream, 
sl@0
   218
                            SymbianStreamBuffer aBuffer,
sl@0
   219
                            void** aReturnPointer)
sl@0
   220
	{
sl@0
   221
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   222
    __ASSERT_ALWAYS(stream, Panic(EOwfSymbianStreamBadArgument));
sl@0
   223
    *aReturnPointer = NULL;
sl@0
   224
    TRAPD(err,*aReturnPointer = stream->GetBufferPtrL(aBuffer));
sl@0
   225
    return err;
sl@0
   226
	}
sl@0
   227
sl@0
   228
EXPORT_C void 
sl@0
   229
SymbianStreamSetProtectionFlag( SymbianStreamType aStream, khronos_bool aFlag)
sl@0
   230
	{
sl@0
   231
	CSurfaceStream*	stream=CSurfaceStream::FromHandle(aStream);
sl@0
   232
	if (stream)
sl@0
   233
		{
sl@0
   234
		stream->SetProtectionFlag(aFlag);
sl@0
   235
		}
sl@0
   236
	}
sl@0
   237
sl@0
   238
/*!
sl@0
   239
 * \brief Register a screen number for surface update notifications.
sl@0
   240
 *
sl@0
   241
 * \param aScreenNum Screen number.
sl@0
   242
 * 
sl@0
   243
 * 
sl@0
   244
 * \return Standard error code or KErrNone
sl@0
   245
 */
sl@0
   246
EXPORT_C TErrCode SymbianStreamRegisterScreenNotifications( khronos_int32_t aScreenNumber, 
sl@0
   247
                                            khronos_int32_t aPriority, 
sl@0
   248
                                            khronos_int32_t aInternalVersion)
sl@0
   249
	{
sl@0
   250
	khronos_int32_t err2=KErrUnknown;
sl@0
   251
	TRAPD(err,err2=COpenWfcStreamMap::InstanceL().RegisterScreenNotifications(aScreenNumber,aPriority,aInternalVersion));
sl@0
   252
	if (err)
sl@0
   253
		{
sl@0
   254
		return err;
sl@0
   255
		}
sl@0
   256
	else
sl@0
   257
		{
sl@0
   258
		return err2;
sl@0
   259
		}
sl@0
   260
	}
sl@0
   261
/*!
sl@0
   262
 * \brief Get handle to registration of a screen number for surface update notifications.
sl@0
   263
 *
sl@0
   264
 * \param aScreenNum Screen number.
sl@0
   265
 * 
sl@0
   266
 * 
sl@0
   267
 * \return Handle to internal object (currently a CBase), or NULL if not registered
sl@0
   268
 */
sl@0
   269
EXPORT_C TErrCode 
sl@0
   270
SymbianStreamHasRegisteredScreenNotifications( khronos_int32_t aScreenNumber,void** aReturnState)
sl@0
   271
    {
sl@0
   272
    TRAPD(err,*aReturnState=(COpenWfcStreamMap::InstanceL().RegisteredScreenNotifications(aScreenNumber)));
sl@0
   273
    return err;
sl@0
   274
    }
sl@0
   275
sl@0
   276
sl@0
   277
/*!
sl@0
   278
 * \brief Unregister a screen number for surface update notifications.
sl@0
   279
 *
sl@0
   280
 * \param aScreenNum Screen number.
sl@0
   281
 * 
sl@0
   282
 * 
sl@0
   283
 * \return Standard error code or KErrNone
sl@0
   284
 */
sl@0
   285
EXPORT_C TErrCode 
sl@0
   286
SymbianStreamUnregisterScreenNotifications(khronos_int32_t aScreenNumber)
sl@0
   287
	{
sl@0
   288
	khronos_int32_t err2=KErrUnknown;
sl@0
   289
	TRAPD(err,err2=COpenWfcStreamMap::InstanceL().UnregisterScreenNotifications(aScreenNumber));
sl@0
   290
	if (err)
sl@0
   291
		{
sl@0
   292
		return err;
sl@0
   293
		}
sl@0
   294
	else
sl@0
   295
		{
sl@0
   296
		return err2;
sl@0
   297
		}
sl@0
   298
	}
sl@0
   299
sl@0
   300
/*!
sl@0
   301
 * \brief Check if two stream objects are the same surface.
sl@0
   302
 *
sl@0
   303
 * \param 	aStream 	compare these two streams.
sl@0
   304
 * \param	aStream2	compare these two streams.
sl@0
   305
 * 
sl@0
   306
 * \return TRUE if they are the same object.
sl@0
   307
 */
sl@0
   308
EXPORT_C khronos_bool SymbianStreamSame(SymbianStreamType aStream, SymbianStreamType aStream2)
sl@0
   309
	{
sl@0
   310
	if  (aStream==aStream2)
sl@0
   311
		return KHR_BOOLEAN_TRUE;
sl@0
   312
	if (!aStream || !aStream2)
sl@0
   313
		return KHR_BOOLEAN_FALSE;
sl@0
   314
	if (*aStream==*aStream2)
sl@0
   315
		return KHR_BOOLEAN_TRUE;
sl@0
   316
	SymbianStreamType found;
sl@0
   317
	if (	aStream->Type()!=aStream->EStreamHandle
sl@0
   318
		&&	aStream2->Type()==aStream2->EStreamHandle)
sl@0
   319
		{
sl@0
   320
		if(KErrNone==SymbianStreamFind(aStream,&found))
sl@0
   321
			{
sl@0
   322
			if  (found==aStream2)
sl@0
   323
				return KHR_BOOLEAN_TRUE;
sl@0
   324
			}
sl@0
   325
		return KHR_BOOLEAN_FALSE;
sl@0
   326
		}
sl@0
   327
	if (	aStream2->Type()!=aStream2->EStreamHandle
sl@0
   328
		&&	aStream->Type()==aStream->EStreamHandle)
sl@0
   329
		{
sl@0
   330
		if(KErrNone==SymbianStreamFind(aStream2,&found))
sl@0
   331
			{
sl@0
   332
			if  (aStream==found)
sl@0
   333
				return KHR_BOOLEAN_TRUE;
sl@0
   334
			}
sl@0
   335
		return KHR_BOOLEAN_FALSE;
sl@0
   336
		}
sl@0
   337
	return KHR_BOOLEAN_FALSE;
sl@0
   338
	}
sl@0
   339
sl@0
   340
EXPORT_C void
sl@0
   341
SymbianStreamProcessNotifications(SymbianStreamType aStream, 
sl@0
   342
                                  khronos_int32_t aEvent, 
sl@0
   343
                                  khronos_int32_t aScreenNumber,
sl@0
   344
                                  khronos_int32_t aSerialNumber,
sl@0
   345
                                  khronos_int32_t* aReturnMask)
sl@0
   346
    {
sl@0
   347
    CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
sl@0
   348
    if (stream)
sl@0
   349
        {
sl@0
   350
        stream->ProcessNotifications(aEvent, aScreenNumber, CSurfaceStream::EDefaultOperation, aSerialNumber, aReturnMask);
sl@0
   351
        }
sl@0
   352
    }
sl@0
   353
sl@0
   354
EXPORT_C void
sl@0
   355
SymbianStreamCheckVisible(SymbianStreamType aStream, 
sl@0
   356
                          khronos_int32_t aEvent, 
sl@0
   357
                          khronos_int32_t aScreenNumber,
sl@0
   358
                          khronos_int32_t aSerialNumber)
sl@0
   359
    {
sl@0
   360
    CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
sl@0
   361
    if (stream)
sl@0
   362
        {
sl@0
   363
        stream->ProcessNotifications(aEvent, aScreenNumber, CSurfaceStream::ECheckVisibleOperation, aSerialNumber, NULL);
sl@0
   364
        }
sl@0
   365
    }
sl@0
   366
sl@0
   367
EXPORT_C TErrCode 
sl@0
   368
SymbianStreamAddExtendedObserver(SymbianStreamType aStream, 
sl@0
   369
                                SymbianStreamCallback aObserver, 
sl@0
   370
                                void* aData, 
sl@0
   371
                                khronos_int32_t aScreenNumber, 
sl@0
   372
                                SymbianStreamEventBits aEvents)
sl@0
   373
    {
sl@0
   374
    CSurfaceStream* stream=CSurfaceStream::FromHandle(aStream);
sl@0
   375
    if (stream && aObserver)
sl@0
   376
        {
sl@0
   377
        TInt ret = KErrNone;
sl@0
   378
        if (!((ret = stream->AddObserver(aObserver, aEvents, aScreenNumber, aData)) == KErrNone) || aEvents != ESOWF_EventUpdated)
sl@0
   379
            {
sl@0
   380
            return ret;
sl@0
   381
            }
sl@0
   382
        if (!((ret = stream->AddObserver(NULL, ESOWF_EventAvailable, aScreenNumber, aData)) == KErrNone))
sl@0
   383
            {
sl@0
   384
            return ret;
sl@0
   385
            }
sl@0
   386
        if (!((ret = stream->AddObserver(NULL, ESOWF_EventDisplayed, aScreenNumber, aData)) == KErrNone))
sl@0
   387
            {
sl@0
   388
            return ret;
sl@0
   389
            }
sl@0
   390
        ret = stream->AddObserver(NULL, ESOWF_EventDisplayedX, aScreenNumber, aData);
sl@0
   391
        return ret;
sl@0
   392
        }
sl@0
   393
    else
sl@0
   394
        {
sl@0
   395
        return KErrArgument;
sl@0
   396
        }
sl@0
   397
    }
sl@0
   398
sl@0
   399
sl@0
   400
sl@0
   401
EXPORT_C void
sl@0
   402
SymbianStreamSetFlipState(SymbianStreamType aStream, SymOwfBool aFlip)
sl@0
   403
    {
sl@0
   404
    CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
sl@0
   405
    if (stream)
sl@0
   406
        {
sl@0
   407
        stream->SetFlipState(aFlip);
sl@0
   408
        }
sl@0
   409
    }
sl@0
   410
sl@0
   411
EXPORT_C TErrCode
sl@0
   412
SymbianStreamGetChunkHandle(SymbianStreamType aStream, TInt* aHandle)
sl@0
   413
    {
sl@0
   414
    CSurfaceStream* stream = CSurfaceStream::FromHandle(aStream);
sl@0
   415
    if (stream && aHandle)
sl@0
   416
        {
sl@0
   417
        *aHandle = stream->GetChunkHandle();
sl@0
   418
        return KErrNone;
sl@0
   419
        }
sl@0
   420
    return KErrArgument;
sl@0
   421
    }
sl@0
   422
sl@0
   423
}   //extern "C" helps fix and verify linkage