svgtopt/VGRenderer/SWVG/src/swopenvgtargetsurfaceimpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:06:58 +0300
branchRCL_3
changeset 17 db5c883ad1c5
permissions -rw-r--r--
Revision: 201026 Kit: 201035

/*
 * Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description:  CSWVGTargetSurfaceImpl source file
 *
*/

#include "swopenvgtargetSurfaceImpl.h"
    
#include <platform/vg/vgcontext.h>

#include <svgtbitmap.h>

CSWVGTargetSurfaceImpl::CSWVGTargetSurfaceImpl()
    {
    }

CSWVGTargetSurfaceImpl::~CSWVGTargetSurfaceImpl()
    {
    }

CSWVGTargetSurfaceImpl* CSWVGTargetSurfaceImpl::NewL()
    {
    CSWVGTargetSurfaceImpl* self = CSWVGTargetSurfaceImpl::NewLC();
    CleanupStack::Pop();
    return self;
    }

CSWVGTargetSurfaceImpl* CSWVGTargetSurfaceImpl::NewLC()
    {
    CSWVGTargetSurfaceImpl* self = new (ELeave) CSWVGTargetSurfaceImpl();
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
    }

inline void CSWVGTargetSurfaceImpl::ConstructL()
    {
    }

TInt CSWVGTargetSurfaceImpl::InitializeSurface(TSize aSize, TInt aColorSpace)
    {
    iSize = aSize;
    TInt vgError = ::VGIInitialize(aSize.iWidth,aSize.iHeight, (VGIColorSpace)aColorSpace);
    return MapOpenVGErrorToSymbianError(vgError);
    }

void CSWVGTargetSurfaceImpl::SetConfiguration(TInt /*aOption*/, const TAny* /*aValue*/)
    {    
    }

TInt CSWVGTargetSurfaceImpl::CreateSurface(TInt /*aDisplayMode*/, RWindow */*aSurface*/, CFbsBitmap */*aBitmap*/)
    { 
    return KErrNotSupported;
    }

TInt CSWVGTargetSurfaceImpl::CreateSurface(TInt /*aDisplayMode*/, RWindow */*aSurface*/, CSvgtBitmap */*aBitmap*/)
    {
    return KErrNone;
    }

TInt CSWVGTargetSurfaceImpl::ResizeSurface(TSize aSize)
    {
    iSize = aSize;
    TInt vgError = ::VGIResize(aSize.iWidth,aSize.iHeight);
    return MapOpenVGErrorToSymbianError(vgError);
    }

TInt CSWVGTargetSurfaceImpl::CopyBitmap(TInt /*aDisplayMode*/, TInt /*aMaskMode*/, CFbsBitmap */*aBitmap*/, CFbsBitmap */*aMask*/, TSize /*aSize*/)
    {
    return KErrNotSupported;
    }
TInt CSWVGTargetSurfaceImpl::CopyBitmap(TInt /*aDisplayMode*/,TInt /*aMaskMode*/,CSvgtBitmap *aBitmap, CSvgtBitmap *aMask, TSize /*aSize*/)
    {
    VGIColorBufferFormat format = 
            (VGIColorBufferFormat)MapSymbianDisplayModeToOpenVG( (TDisplayMode)aBitmap->DisplayMode() );
    
    TInt vgError = KErrNone;
    if(aMask) 
        {
        vgError = ::VGICopyToTarget(format, 
                    aBitmap->Stride(), aBitmap->BitmapBuffer(), 
                    aMask->Stride(), aMask->BitmapBuffer(), 
                    VGI_SKIP_TRANSPARENT_PIXELS);
        }
    else
        {
        vgError = ::VGICopyToTarget(format, 
                    aBitmap->Stride(), aBitmap->BitmapBuffer(), 
                    0, NULL, 
                    VGI_COPY_TRANSPARENT_PIXELS);
        }
        
    return MapOpenVGErrorToSymbianError(vgError);
    }

TInt CSWVGTargetSurfaceImpl::PrepareToBindClientBuffer()
    {
    return KErrNone;
    }

TInt CSWVGTargetSurfaceImpl::BindClientBuffer(TInt buffer)
    {
    return MapOpenVGErrorToSymbianError(::VGIBindToImage(buffer));
    }
  
TInt CSWVGTargetSurfaceImpl::UnBindClientBuffer()
    {
    return MapOpenVGErrorToSymbianError(::VGIUnBindImage());
    }

void CSWVGTargetSurfaceImpl::TerminateSurface()
    {
    ::VGITerminate();
    }

TInt CSWVGTargetSurfaceImpl::MapSymbianDisplayModeToOpenVG( TDisplayMode aMode) const
    {
    VGIColorBufferFormat format;
    switch( aMode )
    {
    case EColor16MA:
        format = VGI_COLOR_BUFFER_FORMAT_ARGB8888;
        break;

    case EColor16MU:
        format = VGI_COLOR_BUFFER_FORMAT_XRGB8888;
        break;

    case EColor16MAP:
        format = VGI_COLOR_BUFFER_FORMAT_ARGB8888_PRE;
        break;
        
    case EColor16M:
        format = VGI_COLOR_BUFFER_FORMAT_RGB888;
        break;

    case EColor64K:
        format = VGI_COLOR_BUFFER_FORMAT_RGB565;
        break;

    case EColor4K:
        format = VGI_COLOR_BUFFER_FORMAT_XRGB4444;
        break;

    default:
        return KErrNotSupported;
    }
    return format;
    }

TInt CSWVGTargetSurfaceImpl::MapOpenVGErrorToSymbianError( TInt aError ) const
    {
    TInt error = KErrNone;
    switch (aError)
        {
        case VGI_OK:
            {
            error = KErrNone;
            break;
            }
        case VG_OUT_OF_MEMORY_ERROR:
        case VGI_ERROR_OUT_OF_MEMORY:
            {
            error = KErrNoMemory;
            break;
            }
        case VG_ILLEGAL_ARGUMENT_ERROR:
        case VGI_ERROR_INVALID_ARGUMENTS:
            {
            error = KErrArgument;
            break;
            }
        case VGI_ERROR_ALREADY_EXISTS:
            {
            error = KErrAlreadyExists;
            break;
            }
        case VG_UNSUPPORTED_PATH_FORMAT_ERROR:
        case VGI_ERROR_COLORSPACE_NOT_SUPPORTED:
        case VG_UNSUPPORTED_IMAGE_FORMAT_ERROR:
        case VGI_ERROR_NOT_SUPPORTED:
            {
            error = KErrNotSupported;
            break;
            }
        case VGI_ERROR_ILLEGAL_IMAGE_HANDLE:
            {
            error = KErrBadHandle;
            break;
            }
        case VG_IMAGE_IN_USE_ERROR:
        case VGI_ERROR_IMAGE_IN_USE:
            {
            error = KErrInUse;
            break;
            }
        case VGI_ERROR_ILLEGAL_OPERATION:
            {
            error = KErrPermissionDenied;
            break;
            }
        case VG_BAD_HANDLE_ERROR:
        case VG_PATH_CAPABILITY_ERROR:
            {
            error = KErrUnknown;
            break;
            }
        default:
            {
            error = KErrUnknown;
            }
        }

    return error;
    }