svgtopt/SVG/SVGEngine/src/SVGEngineImpl.cpp
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  SVG Engine source file
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#if !defined(__E32BASE_H__)
hgs
parents:
diff changeset
    22
#include <e32base.h>
hgs
parents:
diff changeset
    23
#endif
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include <utf.h>
hgs
parents:
diff changeset
    26
#include <s32mem.h>
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#include "SVGDOMImplementationImpl.h"
hgs
parents:
diff changeset
    29
#include "SVGElementImpl.h"
hgs
parents:
diff changeset
    30
#include "SVGDocumentImpl.h"
hgs
parents:
diff changeset
    31
#include "SVGSvgElementImpl.h"
hgs
parents:
diff changeset
    32
#include "SVGUseElementImpl.h"
hgs
parents:
diff changeset
    33
#include "SVGAnimationElementImpl.h"
hgs
parents:
diff changeset
    34
#include "SVGTextElementImpl.h"
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
#include "SVGAudioElementImpl.h"
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
#include "Gfx2dGcOpenVG.h"
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
#include "SVGSchemaData.h"
hgs
parents:
diff changeset
    42
#include "SVGPathElementImpl.h"
hgs
parents:
diff changeset
    43
#include "SVGAnimationBase.h"
hgs
parents:
diff changeset
    44
#include "SVGElementTimeControl.h"
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
#include "SVGRequestObserver.h"
hgs
parents:
diff changeset
    47
#include "SVGHyperlinkListener.h"
hgs
parents:
diff changeset
    48
#include "SVGListener.h"
hgs
parents:
diff changeset
    49
#include "SVGAnimationListener.h"
hgs
parents:
diff changeset
    50
#include "SVGAElementImpl.h"
hgs
parents:
diff changeset
    51
#include "SVGTextAreaElementImpl.h"
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
#include "SVGTimer.h"
hgs
parents:
diff changeset
    54
#include "SVGEventHandler.h"
hgs
parents:
diff changeset
    55
#include "SVGEngineImpl.h"
hgs
parents:
diff changeset
    56
#include "SVGErrorImpl.h"
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
#include "SVGFloatCssValueImpl.h"
hgs
parents:
diff changeset
    59
#include "SVGTimeContainer.h"
hgs
parents:
diff changeset
    60
#include "SVGMediaAnimationElementImpl.h"
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
// Constants
hgs
parents:
diff changeset
    63
// length of </text>
hgs
parents:
diff changeset
    64
const TInt KClosingTextTagLength = 7;
hgs
parents:
diff changeset
    65
// Length of </textArea>
hgs
parents:
diff changeset
    66
const TInt KClosingTextAreaTagLength = 11;
hgs
parents:
diff changeset
    67
// Length of <
hgs
parents:
diff changeset
    68
const TInt KClosingBracesLength = 1;
hgs
parents:
diff changeset
    69
// Number of chars to be converted at a time to Unicode
hgs
parents:
diff changeset
    70
const TInt KMaxConversionChars = 20;
hgs
parents:
diff changeset
    71
_LIT(KClosingTextTag,"</text>");
hgs
parents:
diff changeset
    72
_LIT(KClosingTextAreaTag,"</textArea>");
hgs
parents:
diff changeset
    73
_LIT(KClosingBraces,">");
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    76
// Two phase constructor for this class
hgs
parents:
diff changeset
    77
// JSR 226 API
hgs
parents:
diff changeset
    78
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
CSvgEngineImpl* CSvgEngineImpl::NewL(CSvgBitmapFontProvider *aSvgBitmapFontProvider)
hgs
parents:
diff changeset
    80
    {
hgs
parents:
diff changeset
    81
    CSvgEngineImpl* self    = new ( ELeave ) CSvgEngineImpl();
hgs
parents:
diff changeset
    82
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    83
    self->ConstructL(aSvgBitmapFontProvider);
hgs
parents:
diff changeset
    84
    CleanupStack::Pop();
hgs
parents:
diff changeset
    85
    return self;
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    90
// CSvgEngineImpl* CSvgEngineImpl::NewLC()
hgs
parents:
diff changeset
    91
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    92
CSvgEngineImpl* CSvgEngineImpl::NewLC(CSvgBitmapFontProvider *aSvgBitmapFontProvider)
hgs
parents:
diff changeset
    93
    {
hgs
parents:
diff changeset
    94
    CSvgEngineImpl* self    = new ( ELeave ) CSvgEngineImpl();
hgs
parents:
diff changeset
    95
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    96
    self->ConstructL(aSvgBitmapFontProvider);
hgs
parents:
diff changeset
    97
    return self;
hgs
parents:
diff changeset
    98
    }
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   101
// CSvgEngineImpl::CSvgEngineImpl() : iTextAreaHandle( NULL ),
hgs
parents:
diff changeset
   102
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   103
CSvgEngineImpl::CSvgEngineImpl() : iTextAreaHandle( NULL ),
hgs
parents:
diff changeset
   104
                                   iRequestObserver( NULL ),
hgs
parents:
diff changeset
   105
                                   iFrameBuffer( NULL ),
hgs
parents:
diff changeset
   106
                                   iFrameBufferSize(TSize(0,0)),
hgs
parents:
diff changeset
   107
                                   iFontHashMap ( NULL ),
hgs
parents:
diff changeset
   108
                                   iSvgDocument( NULL ),
hgs
parents:
diff changeset
   109
                                   iBackgroundColor(0x00000000),
hgs
parents:
diff changeset
   110
                                   iShowDebugInfo( EFalse ),
hgs
parents:
diff changeset
   111
                                   iSvgEngineState(ESVGEngineNotStarted),
hgs
parents:
diff changeset
   112
                                   iTimeoutSeconds( 0 ),
hgs
parents:
diff changeset
   113
                                   iRenderQuality(2), // Set To Rendering quality "high"
hgs
parents:
diff changeset
   114
                                   iCustomOption( ETrue ),
hgs
parents:
diff changeset
   115
                                   iFrameBufferOverridesViewport( EFalse ),
hgs
parents:
diff changeset
   116
                                   iClientDefinedViewPort(EFalse)
hgs
parents:
diff changeset
   117
                                   
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   123
// void CSvgEngineImpl::ConstructL()
hgs
parents:
diff changeset
   124
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   125
void CSvgEngineImpl::ConstructL(CSvgBitmapFontProvider *aSvgBitmapFontProvider)
hgs
parents:
diff changeset
   126
    {
hgs
parents:
diff changeset
   127
    iGfxContext = NULL;
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
	iSvgBitmapFontProvider = aSvgBitmapFontProvider ; 
hgs
parents:
diff changeset
   130
    // create CSvgErrorImpl object
hgs
parents:
diff changeset
   131
    iSvgError = CSvgErrorImpl::NewL();
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
    iFontHashMap = CSvgFontHashMap::NewL();
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    SetIgnoreUpdateScreen( EFalse );
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
   // The iCustomOption need to be initialized for JSR
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
	iCustomOption = ETrue;
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
    }
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   146
// Two phase constructor for this class
hgs
parents:
diff changeset
   147
// Accepts a frame buffer and a MSvgRequestObserver object from the client
hgs
parents:
diff changeset
   148
// Buffer is used for rasterization of SVG content
hgs
parents:
diff changeset
   149
// Observer object, if provided, is used for notifying the client on updates
hgs
parents:
diff changeset
   150
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   151
CSvgEngineImpl* CSvgEngineImpl::NewL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   152
                                      MSvgRequestObserver* aReqObserver, TFontSpec& aFontSpec, CSvgBitmapFontProvider* aSvgBitmapFontProvider )
hgs
parents:
diff changeset
   153
    {
hgs
parents:
diff changeset
   154
    CSvgEngineImpl* self    = new ( ELeave ) CSvgEngineImpl( aFrameBuffer,
hgs
parents:
diff changeset
   155
                                                             aReqObserver );
hgs
parents:
diff changeset
   156
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   157
    self->ConstructL(aFontSpec, aSvgBitmapFontProvider);
hgs
parents:
diff changeset
   158
    CleanupStack::Pop();
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
    return self;
hgs
parents:
diff changeset
   161
    }
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   165
// Two phase constructor for this class
hgs
parents:
diff changeset
   166
// Accepts a frame buffer and a MSvgRequestObserver object from the client
hgs
parents:
diff changeset
   167
// Buffer is used for rasterization of SVG content
hgs
parents:
diff changeset
   168
// Observer object, if provided, is used for notifying the client on updates
hgs
parents:
diff changeset
   169
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   170
CSvgEngineImpl* CSvgEngineImpl::NewLC( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   171
                                       MSvgRequestObserver* aReqObserver, TFontSpec& aFontSpec, CSvgBitmapFontProvider* aSvgBitmapFontProvider )
hgs
parents:
diff changeset
   172
    {
hgs
parents:
diff changeset
   173
    CSvgEngineImpl* self    = new ( ELeave ) CSvgEngineImpl( aFrameBuffer, aReqObserver );
hgs
parents:
diff changeset
   174
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   175
    self->ConstructL(aFontSpec, aSvgBitmapFontProvider);
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
    return self;
hgs
parents:
diff changeset
   178
    }
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   181
// Symbian style private method that is used to construct heap objects
hgs
parents:
diff changeset
   182
// Builds the Graphics device objects with the client's frame buffer info
hgs
parents:
diff changeset
   183
// Builds the event handler object
hgs
parents:
diff changeset
   184
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   185
void CSvgEngineImpl::ConstructL( TFontSpec& aFontSpec, CSvgBitmapFontProvider* aSvgBitmapFontProvider)
hgs
parents:
diff changeset
   186
    {
hgs
parents:
diff changeset
   187
    iBitmapFontSpec = aFontSpec;
hgs
parents:
diff changeset
   188
// iGfxContext is created through CSvgEngineInterfaceImpl::ConstructL
hgs
parents:
diff changeset
   189
   // iGfxContext = CGfx2dGcVGR::NewL( iFrameBuffer->SizeInPixels(), iBitmapFontSpec );
hgs
parents:
diff changeset
   190
    iSvgBitmapFontProvider = aSvgBitmapFontProvider ; 
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
    iGfxContext = CGfx2dGcOpenVG::NewL( iFrameBuffer->SizeInPixels(), iBitmapFontSpec, iSvgBitmapFontProvider );
hgs
parents:
diff changeset
   193
    // create CSvgErrorImpl object
hgs
parents:
diff changeset
   194
    iSvgError = CSvgErrorImpl::NewL();
hgs
parents:
diff changeset
   195
    iFontHashMap = CSvgFontHashMap::NewL();
hgs
parents:
diff changeset
   196
    iSvgNames = new (ELeave) CDesC16ArrayFlat(5);
hgs
parents:
diff changeset
   197
    }
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   200
CSvgEngineImpl* CSvgEngineImpl::NewL( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   201
                                      MSvgRequestObserver* aReqObserver, TFontSpec& aFontSpec, CSvgBitmapFontProvider* aSvgBitmapFontProvider ,SVGRendererId aRendererType)
hgs
parents:
diff changeset
   202
    {
hgs
parents:
diff changeset
   203
    CSvgEngineImpl* self    = new ( ELeave ) CSvgEngineImpl( aFrameBuffer,
hgs
parents:
diff changeset
   204
                                                             aReqObserver );
hgs
parents:
diff changeset
   205
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   206
    self->ConstructL(aFontSpec, aSvgBitmapFontProvider,aRendererType);
hgs
parents:
diff changeset
   207
    CleanupStack::Pop();
hgs
parents:
diff changeset
   208
	
hgs
parents:
diff changeset
   209
    return self;
hgs
parents:
diff changeset
   210
    }
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   214
// Two phase constructor for this class
hgs
parents:
diff changeset
   215
// Accepts a frame buffer and a MSvgRequestObserver object from the client
hgs
parents:
diff changeset
   216
// Buffer is used for rasterization of SVG content
hgs
parents:
diff changeset
   217
// Observer object, if provided, is used for notifying the client on updates.
hgs
parents:
diff changeset
   218
//This contains the renderer selector parameter
hgs
parents:
diff changeset
   219
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   220
CSvgEngineImpl* CSvgEngineImpl::NewLC( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   221
                                       MSvgRequestObserver* aReqObserver, TFontSpec& aFontSpec, CSvgBitmapFontProvider* aSvgBitmapFontProvider,SVGRendererId aRendererType )
hgs
parents:
diff changeset
   222
    {
hgs
parents:
diff changeset
   223
    CSvgEngineImpl* self    = new ( ELeave ) CSvgEngineImpl( aFrameBuffer, aReqObserver );
hgs
parents:
diff changeset
   224
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   225
    self->ConstructL(aFontSpec, aSvgBitmapFontProvider,aRendererType);
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
    return self;
hgs
parents:
diff changeset
   228
    }
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   231
// Symbian style private method that is used to construct heap objects
hgs
parents:
diff changeset
   232
// Builds the Graphics device objects with the client's frame buffer info
hgs
parents:
diff changeset
   233
// Builds the event handler object.
hgs
parents:
diff changeset
   234
//This contains the renderer selector parameter NGA
hgs
parents:
diff changeset
   235
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   236
void CSvgEngineImpl::ConstructL( TFontSpec& aFontSpec, CSvgBitmapFontProvider* aSvgBitmapFontProvider,SVGRendererId aRendererType)
hgs
parents:
diff changeset
   237
    {
hgs
parents:
diff changeset
   238
    iBitmapFontSpec = aFontSpec;
hgs
parents:
diff changeset
   239
// iGfxContext is created through CSvgEngineInterfaceImpl::ConstructL
hgs
parents:
diff changeset
   240
   // iGfxContext = CGfx2dGcVGR::NewL( iFrameBuffer->SizeInPixels(), iBitmapFontSpec );
hgs
parents:
diff changeset
   241
    iSvgBitmapFontProvider = aSvgBitmapFontProvider ; 
hgs
parents:
diff changeset
   242
hgs
parents:
diff changeset
   243
    iGfxContext = CGfx2dGcOpenVG::NewL( iFrameBufferSize, iBitmapFontSpec, iSvgBitmapFontProvider ,aRendererType);
hgs
parents:
diff changeset
   244
    // create CSvgErrorImpl object
hgs
parents:
diff changeset
   245
    iSvgError = CSvgErrorImpl::NewL();
hgs
parents:
diff changeset
   246
    iFontHashMap = CSvgFontHashMap::NewL();
hgs
parents:
diff changeset
   247
    iSvgNames = new (ELeave) CDesC16ArrayFlat(5);
hgs
parents:
diff changeset
   248
    }
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   252
// Private constructor
hgs
parents:
diff changeset
   253
// Initializes private attributes
hgs
parents:
diff changeset
   254
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   255
CSvgEngineImpl::CSvgEngineImpl( CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
   256
                                MSvgRequestObserver* aReqObserver ) : iTextAreaHandle( NULL ),
hgs
parents:
diff changeset
   257
                                                                      iRequestObserver( aReqObserver ),
hgs
parents:
diff changeset
   258
                                                                      iFrameBuffer( aFrameBuffer ),
hgs
parents:
diff changeset
   259
                                                                      iFrameBufferSize(TSize(0,0)),
hgs
parents:
diff changeset
   260
                                                                      iFontHashMap ( NULL),
hgs
parents:
diff changeset
   261
                                                                      iSvgDocument( NULL ),
hgs
parents:
diff changeset
   262
                                                                      iBackgroundColor(0x00000000),
hgs
parents:
diff changeset
   263
                                                                      iShowDebugInfo( EFalse ),
hgs
parents:
diff changeset
   264
                                                                      iSvgEngineState(ESVGEngineNotStarted),
hgs
parents:
diff changeset
   265
                                                                      iCustomOption( ETrue ),
hgs
parents:
diff changeset
   266
                                                                      iFrameBufferOverridesViewport( EFalse )
hgs
parents:
diff changeset
   267
                                                                      
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
    {
hgs
parents:
diff changeset
   270
        if(aFrameBuffer && aFrameBuffer->Handle()>0)
hgs
parents:
diff changeset
   271
            {
hgs
parents:
diff changeset
   272
                iFrameBufferSize = aFrameBuffer->SizeInPixels();
hgs
parents:
diff changeset
   273
            }
hgs
parents:
diff changeset
   274
    }
hgs
parents:
diff changeset
   275
hgs
parents:
diff changeset
   276
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   277
// Destructor
hgs
parents:
diff changeset
   278
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   279
CSvgEngineImpl::~CSvgEngineImpl()
hgs
parents:
diff changeset
   280
    {
hgs
parents:
diff changeset
   281
    Destroy();
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
    if ( iFontHashMap )
hgs
parents:
diff changeset
   284
    {
hgs
parents:
diff changeset
   285
		delete iFontHashMap;
hgs
parents:
diff changeset
   286
		iFontHashMap = NULL;
hgs
parents:
diff changeset
   287
    }
hgs
parents:
diff changeset
   288
hgs
parents:
diff changeset
   289
	iSvgTextBoundingBoxes.ResetAndDestroy();
hgs
parents:
diff changeset
   290
	iSvgTextBoundingBoxes.Close();
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
    if ( iGfxContext )
hgs
parents:
diff changeset
   293
        {
hgs
parents:
diff changeset
   294
        delete iGfxContext;
hgs
parents:
diff changeset
   295
        iGfxContext = NULL;
hgs
parents:
diff changeset
   296
        }
hgs
parents:
diff changeset
   297
    if ( iSvgError )
hgs
parents:
diff changeset
   298
        {
hgs
parents:
diff changeset
   299
        delete iSvgError;
hgs
parents:
diff changeset
   300
        iSvgError = NULL;
hgs
parents:
diff changeset
   301
        }
hgs
parents:
diff changeset
   302
    if (iTextAreaHandle)
hgs
parents:
diff changeset
   303
    {
hgs
parents:
diff changeset
   304
    delete iTextAreaHandle;
hgs
parents:
diff changeset
   305
    iTextAreaHandle = NULL;
hgs
parents:
diff changeset
   306
    }
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
    iTextAreaListeners.Close();
hgs
parents:
diff changeset
   309
    iTextListeners.Close();
hgs
parents:
diff changeset
   310
    iHyperlinkListeners.Close();
hgs
parents:
diff changeset
   311
    iAnimationListeners.Close();
hgs
parents:
diff changeset
   312
    iSvgMouseListeners.Close();
hgs
parents:
diff changeset
   313
    iInteractiveElementListeners.Close();
hgs
parents:
diff changeset
   314
    delete iSvgNames;
hgs
parents:
diff changeset
   315
    }
hgs
parents:
diff changeset
   316
hgs
parents:
diff changeset
   317
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   318
// Draws aRootElement and calls itself for children.
hgs
parents:
diff changeset
   319
// Handles switch element differently, as it only draws one of its children.
hgs
parents:
diff changeset
   320
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
void CSvgEngineImpl::DrawElementsL( CSvgElementImpl* aRootElement)
hgs
parents:
diff changeset
   323
    {
hgs
parents:
diff changeset
   324
    if ( aRootElement != NULL)
hgs
parents:
diff changeset
   325
        {
hgs
parents:
diff changeset
   326
        TInt32 displayValue = 0;
hgs
parents:
diff changeset
   327
        //  while we have next elements
hgs
parents:
diff changeset
   328
        CSvgElementImpl* newElement = aRootElement;
hgs
parents:
diff changeset
   329
        while( newElement != NULL )
hgs
parents:
diff changeset
   330
            {
hgs
parents:
diff changeset
   331
		    if(newElement->GetAttributeIntL( KCSS_ATTR_DISPLAY, displayValue ) == KErrNoAttribute)
hgs
parents:
diff changeset
   332
		        {
hgs
parents:
diff changeset
   333
		        newElement = ( CSvgElementImpl* ) newElement->FirstChild();
hgs
parents:
diff changeset
   334
		        while ( newElement != NULL )
hgs
parents:
diff changeset
   335
		            {
hgs
parents:
diff changeset
   336
		            DrawElementsL( newElement );
hgs
parents:
diff changeset
   337
		            newElement = ( CSvgElementImpl * ) newElement->NextSibling();
hgs
parents:
diff changeset
   338
		            }
hgs
parents:
diff changeset
   339
		            return;
hgs
parents:
diff changeset
   340
		         }
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
            if(displayValue != KDisplayEnumNone) // is it a hidden element
hgs
parents:
diff changeset
   343
                {
hgs
parents:
diff changeset
   344
                CCssValue*  CssValue = NULL;
hgs
parents:
diff changeset
   345
                TReal32 opacity = 1;
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
                // check visisbility
hgs
parents:
diff changeset
   348
                TInt32  visbilityValue = 0;
hgs
parents:
diff changeset
   349
                TInt visibility = newElement->GetAttributeIntL( KCSS_ATTR_VISIBILITY, visbilityValue );
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
                newElement->FindProperty( KCSS_ATTR_GROUP_OPACITY, CssValue, newElement );
hgs
parents:
diff changeset
   352
                if ( CssValue )
hgs
parents:
diff changeset
   353
                    {
hgs
parents:
diff changeset
   354
                    opacity = ((CFloatCssValueImpl*)CssValue)->Value();
hgs
parents:
diff changeset
   355
                    }
hgs
parents:
diff changeset
   356
hgs
parents:
diff changeset
   357
                if( opacity != 1 && !newElement->IsInherited( KCSS_ATTR_GROUP_OPACITY ) )
hgs
parents:
diff changeset
   358
                    {
hgs
parents:
diff changeset
   359
                    iGfxContext->BindToImageL();
hgs
parents:
diff changeset
   360
                    // Group opacity
hgs
parents:
diff changeset
   361
                    if ( newElement->ElemID() == KSvgGElement && newElement->FirstChild() )
hgs
parents:
diff changeset
   362
                        {
hgs
parents:
diff changeset
   363
                        // recurse with right context.
hgs
parents:
diff changeset
   364
                        DrawElementsL( ( CSvgElementImpl* )newElement->FirstChild());
hgs
parents:
diff changeset
   365
                        }
hgs
parents:
diff changeset
   366
                    // Element opacity
hgs
parents:
diff changeset
   367
                    else
hgs
parents:
diff changeset
   368
                        {
hgs
parents:
diff changeset
   369
                        TBool canDraw = ETrue;
hgs
parents:
diff changeset
   370
                        if( (visibility == KErrNone) && (visbilityValue == 0) )
hgs
parents:
diff changeset
   371
                            {
hgs
parents:
diff changeset
   372
                            canDraw = newElement->DrawL( iGfxContext, NULL ) ;
hgs
parents:
diff changeset
   373
                             }
hgs
parents:
diff changeset
   374
                        if( canDraw && newElement->FirstChild() )
hgs
parents:
diff changeset
   375
                            {
hgs
parents:
diff changeset
   376
                            DrawElementsL( ( CSvgElementImpl* )newElement->FirstChild() );
hgs
parents:
diff changeset
   377
                            }
hgs
parents:
diff changeset
   378
                        }
hgs
parents:
diff changeset
   379
hgs
parents:
diff changeset
   380
                    // Blend opacity context buffer with parent's gfx context buffer
hgs
parents:
diff changeset
   381
                    iGfxContext->UnbindFromImageL( opacity );
hgs
parents:
diff changeset
   382
                    }
hgs
parents:
diff changeset
   383
                else // no opacity or is inherited from above....
hgs
parents:
diff changeset
   384
                    {
hgs
parents:
diff changeset
   385
                    TBool canDraw = ETrue;
hgs
parents:
diff changeset
   386
                    if( (visibility == KErrNone) && (visbilityValue == 0) )
hgs
parents:
diff changeset
   387
                        {
hgs
parents:
diff changeset
   388
                        canDraw = newElement->DrawL(iGfxContext, NULL );
hgs
parents:
diff changeset
   389
                        }
hgs
parents:
diff changeset
   390
                    if( canDraw && newElement->FirstChild() )
hgs
parents:
diff changeset
   391
                        {
hgs
parents:
diff changeset
   392
                        DrawElementsL( ( CSvgElementImpl* )newElement->FirstChild());
hgs
parents:
diff changeset
   393
                        }
hgs
parents:
diff changeset
   394
                    }
hgs
parents:
diff changeset
   395
				}
hgs
parents:
diff changeset
   396
            newElement = ( CSvgElementImpl * )newElement->NextSibling();
hgs
parents:
diff changeset
   397
hgs
parents:
diff changeset
   398
            }// end while....
hgs
parents:
diff changeset
   399
        }
hgs
parents:
diff changeset
   400
    }
hgs
parents:
diff changeset
   401
hgs
parents:
diff changeset
   402
//--------------------------------------------------------------------
hgs
parents:
diff changeset
   403
//CFbsBitmap* CSvgEngineImpl::CreateOpacityFrameBufferL()
hgs
parents:
diff changeset
   404
//--------------------------------------------------------------------
hgs
parents:
diff changeset
   405
CFbsBitmap* CSvgEngineImpl::CreateOpacityFrameBufferL()
hgs
parents:
diff changeset
   406
{
hgs
parents:
diff changeset
   407
    CFbsBitmap* bitmap = new ( ELeave ) CFbsBitmap();
hgs
parents:
diff changeset
   408
hgs
parents:
diff changeset
   409
    if ( iFrameBuffer != NULL )
hgs
parents:
diff changeset
   410
        {
hgs
parents:
diff changeset
   411
/*NGA reverse*/if ( bitmap->Create( iFrameBufferSize, EColor16MU ) != KErrNone )
hgs
parents:
diff changeset
   412
            {
hgs
parents:
diff changeset
   413
            delete bitmap;
hgs
parents:
diff changeset
   414
            bitmap = NULL;
hgs
parents:
diff changeset
   415
            }
hgs
parents:
diff changeset
   416
        }
hgs
parents:
diff changeset
   417
    return bitmap;
hgs
parents:
diff changeset
   418
    }
hgs
parents:
diff changeset
   419
hgs
parents:
diff changeset
   420
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   421
// Copy 32-bit buffer
hgs
parents:
diff changeset
   422
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   423
hgs
parents:
diff changeset
   424
void CSvgEngineImpl::CopyBuffer( TUint32* aSrc, TUint32* aDest, const TSize aSize )
hgs
parents:
diff changeset
   425
    {
hgs
parents:
diff changeset
   426
    if ( aSrc && aDest )
hgs
parents:
diff changeset
   427
        {
hgs
parents:
diff changeset
   428
        Mem::Copy( aDest, aSrc, aSize.iWidth * aSize.iHeight * sizeof( TUint32 ) );
hgs
parents:
diff changeset
   429
        }
hgs
parents:
diff changeset
   430
    }
hgs
parents:
diff changeset
   431
hgs
parents:
diff changeset
   432
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   433
// Positions the root element and calls itself (recursively) for all the
hgs
parents:
diff changeset
   434
// descendant elements
hgs
parents:
diff changeset
   435
// CTM stands for 'Current Transformation Matrix'.
hgs
parents:
diff changeset
   436
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   437
void CSvgEngineImpl::UpdateCTM(CSvgDocumentImpl* aSvgDocument)
hgs
parents:
diff changeset
   438
    {
hgs
parents:
diff changeset
   439
hgs
parents:
diff changeset
   440
    if (aSvgDocument)
hgs
parents:
diff changeset
   441
    {
hgs
parents:
diff changeset
   442
        ((CSvgElementImpl*)aSvgDocument->RootElement())->UpdateCTM();
hgs
parents:
diff changeset
   443
    }
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
hgs
parents:
diff changeset
   446
    }
hgs
parents:
diff changeset
   447
hgs
parents:
diff changeset
   448
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   449
// Initializes the SVG Engine primarily with width and height informtion
hgs
parents:
diff changeset
   450
// This is based on the attribute specifications for the root 'svg' element
hgs
parents:
diff changeset
   451
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   452
void CSvgEngineImpl::InitializeEngineL()
hgs
parents:
diff changeset
   453
    {
hgs
parents:
diff changeset
   454
    // VIEWBOX
hgs
parents:
diff changeset
   455
    // If x, y, w, h of outmost svg not defined, then put default values: 0 0 100% 100%
hgs
parents:
diff changeset
   456
    // return;
hgs
parents:
diff changeset
   457
    // Set locale, so that there is no thousands separator
hgs
parents:
diff changeset
   458
hgs
parents:
diff changeset
   459
    if( !iSvgDocument )
hgs
parents:
diff changeset
   460
        return;
hgs
parents:
diff changeset
   461
hgs
parents:
diff changeset
   462
    iSvgDocument->iInitialDrawFlag = ETrue;
hgs
parents:
diff changeset
   463
    if(!((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iIsWidthSet)
hgs
parents:
diff changeset
   464
    {
hgs
parents:
diff changeset
   465
        ((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iIsWidthSet = ETrue;
hgs
parents:
diff changeset
   466
    }
hgs
parents:
diff changeset
   467
    if(!((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iIsHeightSet)
hgs
parents:
diff changeset
   468
    {
hgs
parents:
diff changeset
   469
        ((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iIsHeightSet = ETrue;
hgs
parents:
diff changeset
   470
    }
hgs
parents:
diff changeset
   471
hgs
parents:
diff changeset
   472
    TLocale locale; // locale object
hgs
parents:
diff changeset
   473
    locale.SetCurrencyTriadsAllowed( EFalse ); // change setting
hgs
parents:
diff changeset
   474
    TSize   lSize   = GetSize();
hgs
parents:
diff changeset
   475
    iSvgDocument->iReqExReqFtrSysLTested = EFalse;
hgs
parents:
diff changeset
   476
    if ( iSvgDocument->RootElement() != NULL &&
hgs
parents:
diff changeset
   477
         ((CSvgElementImpl*)iSvgDocument->RootElement())->ElemID() == KSvgSvgElement )
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
        {
hgs
parents:
diff changeset
   480
        // Scale width & height to fit to screen size
hgs
parents:
diff changeset
   481
        CSvgSvgElementImpl*     el      = ( CSvgSvgElementImpl* )
hgs
parents:
diff changeset
   482
                                          (iSvgDocument->RootElement());
hgs
parents:
diff changeset
   483
        TFloatFixPt                  width, height;
hgs
parents:
diff changeset
   484
        TInt                    widthInt, heightInt;
hgs
parents:
diff changeset
   485
        TFloatFixPt scrnW( lSize.iWidth ), scrnH( lSize.iHeight );
hgs
parents:
diff changeset
   486
        TFloatFixPt                  zero    ( 0 );
hgs
parents:
diff changeset
   487
        
hgs
parents:
diff changeset
   488
        if ( iFrameBufferOverridesViewport )
hgs
parents:
diff changeset
   489
        {
hgs
parents:
diff changeset
   490
        		//special case for Aknicon
hgs
parents:
diff changeset
   491
    				//the don't care what the contents viewport is they just want it to scale to the framebuffer's size
hgs
parents:
diff changeset
   492
        		width = scrnW;
hgs
parents:
diff changeset
   493
        		height= scrnH;
hgs
parents:
diff changeset
   494
        }
hgs
parents:
diff changeset
   495
        else
hgs
parents:
diff changeset
   496
        {
hgs
parents:
diff changeset
   497
            //bitmap from the client overrides width height specified in svg
hgs
parents:
diff changeset
   498
      
hgs
parents:
diff changeset
   499
            if(iViewPortListener != NULL)
hgs
parents:
diff changeset
   500
            {
hgs
parents:
diff changeset
   501
                TInt tempWidth=0,tempHeight=0;
hgs
parents:
diff changeset
   502
                iViewPortListener->GetViewPort(
hgs
parents:
diff changeset
   503
                ((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iWidthInUserCoordinate, 
hgs
parents:
diff changeset
   504
                ((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iHeightInUserCoordinate, 
hgs
parents:
diff changeset
   505
                ((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iWidthInPercentage, 
hgs
parents:
diff changeset
   506
                ((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iHeightInPercentage,
hgs
parents:
diff changeset
   507
                tempWidth,
hgs
parents:
diff changeset
   508
                tempHeight);
hgs
parents:
diff changeset
   509
            
hgs
parents:
diff changeset
   510
                width = (TFloatFixPt) tempWidth;
hgs
parents:
diff changeset
   511
                height = (TFloatFixPt) tempHeight;
hgs
parents:
diff changeset
   512
                
hgs
parents:
diff changeset
   513
                //used in SetWindowViewportTrans of svgSvgElementImpl
hgs
parents:
diff changeset
   514
                iClientDefinedViewPort = ETrue;
hgs
parents:
diff changeset
   515
                     
hgs
parents:
diff changeset
   516
            }
hgs
parents:
diff changeset
   517
        else
hgs
parents:
diff changeset
   518
            {
hgs
parents:
diff changeset
   519
        
hgs
parents:
diff changeset
   520
                TReal32 per = 100;
hgs
parents:
diff changeset
   521
                if(((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iWidthInPercentage)
hgs
parents:
diff changeset
   522
                {   
hgs
parents:
diff changeset
   523
                    width = ( TFloatFixPt ) (( lSize.iWidth/per ) * ((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iWidthInUserCoordinate);
hgs
parents:
diff changeset
   524
                }
hgs
parents:
diff changeset
   525
                else
hgs
parents:
diff changeset
   526
                {   
hgs
parents:
diff changeset
   527
                    width  = (TFloatFixPt)  (((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iWidthInUserCoordinate);
hgs
parents:
diff changeset
   528
                }
hgs
parents:
diff changeset
   529
        
hgs
parents:
diff changeset
   530
                if(((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iHeightInPercentage)
hgs
parents:
diff changeset
   531
                {
hgs
parents:
diff changeset
   532
                    height = ( TFloatFixPt ) (( lSize.iHeight/per ) * ((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iHeightInUserCoordinate);
hgs
parents:
diff changeset
   533
                }
hgs
parents:
diff changeset
   534
                else
hgs
parents:
diff changeset
   535
                {
hgs
parents:
diff changeset
   536
                    height  = (TFloatFixPt)  (((CSvgSvgElementImpl *)(iSvgDocument->RootElement()))->iHeightInUserCoordinate);
hgs
parents:
diff changeset
   537
            }
hgs
parents:
diff changeset
   538
        
hgs
parents:
diff changeset
   539
        //default to XmidYmid_meet
hgs
parents:
diff changeset
   540
        TSvgPreserveAspectAlignType lPreserverAspectAlignment = ESvgPreserveAspectRatio_XmidYmid;
hgs
parents:
diff changeset
   541
  			TSvgMeetOrSliceType lMeetOrSlice = ESvgMeetOrSlice_Meet;
hgs
parents:
diff changeset
   542
  		
hgs
parents:
diff changeset
   543
  		MSvgPreserveAspectRatio* aPreserveAspectRatio;
hgs
parents:
diff changeset
   544
        el->GetPreserveAspectRatio(aPreserveAspectRatio);
hgs
parents:
diff changeset
   545
        
hgs
parents:
diff changeset
   546
        if (aPreserveAspectRatio)
hgs
parents:
diff changeset
   547
        {
hgs
parents:
diff changeset
   548
        	lPreserverAspectAlignment = aPreserveAspectRatio->GetAlign();
hgs
parents:
diff changeset
   549
        	lMeetOrSlice = aPreserveAspectRatio->GetMeetOrSlice();
hgs
parents:
diff changeset
   550
        	
hgs
parents:
diff changeset
   551
        	//el->SetPreserveAspectRatioL(  lPreserverAspectAlignment, lMeetOrSlice);
hgs
parents:
diff changeset
   552
        	if( lPreserverAspectAlignment == ESvgPreserveAspectRatio_None && lMeetOrSlice == ESvgMeetOrSlice_Meet )
hgs
parents:
diff changeset
   553
        	{
hgs
parents:
diff changeset
   554
            width = scrnW;
hgs
parents:
diff changeset
   555
            height = scrnH;
hgs
parents:
diff changeset
   556
        	}
hgs
parents:
diff changeset
   557
        }
hgs
parents:
diff changeset
   558
            
hgs
parents:
diff changeset
   559
        if( lMeetOrSlice == ESvgMeetOrSlice_Meet && !(lPreserverAspectAlignment == ESvgPreserveAspectRatio_None) )
hgs
parents:
diff changeset
   560
            {
hgs
parents:
diff changeset
   561
            widthInt = ( TInt ) width;
hgs
parents:
diff changeset
   562
            heightInt = ( TInt ) height;
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
            // to avoid division by zero.
hgs
parents:
diff changeset
   565
            TInt    rh  = lSize.iWidth ;
hgs
parents:
diff changeset
   566
            if (widthInt != 0)
hgs
parents:
diff changeset
   567
                {
hgs
parents:
diff changeset
   568
                rh  = heightInt* lSize.iWidth / widthInt;
hgs
parents:
diff changeset
   569
                }
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
            if ( rh <= lSize.iHeight )
hgs
parents:
diff changeset
   572
                {
hgs
parents:
diff changeset
   573
                width = scrnW;
hgs
parents:
diff changeset
   574
                height = TFloatFixPt( rh );
hgs
parents:
diff changeset
   575
                }
hgs
parents:
diff changeset
   576
            else
hgs
parents:
diff changeset
   577
                {
hgs
parents:
diff changeset
   578
                // to avoid division by zero.
hgs
parents:
diff changeset
   579
                if (heightInt != 0)
hgs
parents:
diff changeset
   580
                    {
hgs
parents:
diff changeset
   581
                    width = TFloatFixPt( ((TReal32)(widthInt * lSize.iHeight)) / heightInt );
hgs
parents:
diff changeset
   582
                    }
hgs
parents:
diff changeset
   583
                height = scrnH;
hgs
parents:
diff changeset
   584
                }
hgs
parents:
diff changeset
   585
            }
hgs
parents:
diff changeset
   586
        else if( lMeetOrSlice == ESvgMeetOrSlice_Slice )
hgs
parents:
diff changeset
   587
            {
hgs
parents:
diff changeset
   588
            widthInt = ( TInt ) width;
hgs
parents:
diff changeset
   589
            heightInt = ( TInt ) height;
hgs
parents:
diff changeset
   590
hgs
parents:
diff changeset
   591
            // to avoid division by zero.
hgs
parents:
diff changeset
   592
            TInt    rh  = lSize.iWidth ;
hgs
parents:
diff changeset
   593
            if (widthInt != 0)
hgs
parents:
diff changeset
   594
                {
hgs
parents:
diff changeset
   595
                rh  = heightInt* lSize.iWidth / widthInt;
hgs
parents:
diff changeset
   596
                }
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
            if ( rh <= lSize.iHeight )
hgs
parents:
diff changeset
   599
                {
hgs
parents:
diff changeset
   600
                // to avoid division by zero.
hgs
parents:
diff changeset
   601
                if (heightInt != 0)
hgs
parents:
diff changeset
   602
                    {
hgs
parents:
diff changeset
   603
                    width = TFloatFixPt( ((TReal32)(widthInt * lSize.iHeight)) / heightInt );
hgs
parents:
diff changeset
   604
                    }
hgs
parents:
diff changeset
   605
                height = scrnH;
hgs
parents:
diff changeset
   606
hgs
parents:
diff changeset
   607
                }
hgs
parents:
diff changeset
   608
            else
hgs
parents:
diff changeset
   609
                {
hgs
parents:
diff changeset
   610
                width = scrnW;
hgs
parents:
diff changeset
   611
                height = TFloatFixPt( rh );
hgs
parents:
diff changeset
   612
                }
hgs
parents:
diff changeset
   613
            }
hgs
parents:
diff changeset
   614
        else
hgs
parents:
diff changeset
   615
            {
hgs
parents:
diff changeset
   616
            }
hgs
parents:
diff changeset
   617
            }//Normal viewer| end of else
hgs
parents:
diff changeset
   618
        }
hgs
parents:
diff changeset
   619
hgs
parents:
diff changeset
   620
        if ( ( width <= zero ) || ( height <= zero ) ) //.
hgs
parents:
diff changeset
   621
        {
hgs
parents:
diff changeset
   622
            width = 0;
hgs
parents:
diff changeset
   623
            height = 0;
hgs
parents:
diff changeset
   624
            return;
hgs
parents:
diff changeset
   625
        }
hgs
parents:
diff changeset
   626
        // Set initial viewport
hgs
parents:
diff changeset
   627
        el->SetAttributeFloatL( KAtrX, zero );
hgs
parents:
diff changeset
   628
        el->SetAttributeFloatL( KAtrY, zero );
hgs
parents:
diff changeset
   629
        el->SetAttributeFloatL( KAtrWidth, width );
hgs
parents:
diff changeset
   630
        el->SetAttributeFloatL( KAtrHeight, height );
hgs
parents:
diff changeset
   631
        }
hgs
parents:
diff changeset
   632
    }
hgs
parents:
diff changeset
   633
hgs
parents:
diff changeset
   634
hgs
parents:
diff changeset
   635
hgs
parents:
diff changeset
   636
hgs
parents:
diff changeset
   637
hgs
parents:
diff changeset
   638
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   639
// This method is called after the SVG file is read and all elements are
hgs
parents:
diff changeset
   640
// constructed
hgs
parents:
diff changeset
   641
// It also looks for rendering properties such as Anti Aliasing at this
hgs
parents:
diff changeset
   642
// point
hgs
parents:
diff changeset
   643
// It calibrates the system for rasterization quality based on contents
hgs
parents:
diff changeset
   644
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   645
TBool CSvgEngineImpl::StartFrameLoopL()
hgs
parents:
diff changeset
   646
    {
hgs
parents:
diff changeset
   647
    if( iRequestObserver != NULL )
hgs
parents:
diff changeset
   648
        {
hgs
parents:
diff changeset
   649
        if(iSvgDocument != NULL && iSvgDocument->iEventHandler != NULL)
hgs
parents:
diff changeset
   650
            {
hgs
parents:
diff changeset
   651
            iRequestObserver->UpdatePresentation(
hgs
parents:
diff changeset
   652
                         iSvgDocument->iEventHandler->AnimationElementsCount());
hgs
parents:
diff changeset
   653
            }
hgs
parents:
diff changeset
   654
        }
hgs
parents:
diff changeset
   655
    if(iSvgDocument != NULL)
hgs
parents:
diff changeset
   656
        {
hgs
parents:
diff changeset
   657
        if ( iSvgDocument->RootElement() )
hgs
parents:
diff changeset
   658
            {
hgs
parents:
diff changeset
   659
            InitializeEngineL(); // set the viewport and viewbox
hgs
parents:
diff changeset
   660
            return ETrue;
hgs
parents:
diff changeset
   661
            }
hgs
parents:
diff changeset
   662
        }
hgs
parents:
diff changeset
   663
    return EFalse;
hgs
parents:
diff changeset
   664
    }
hgs
parents:
diff changeset
   665
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   666
// UpdatePresentation()
hgs
parents:
diff changeset
   667
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   668
void  CSvgEngineImpl::UpdatePresentation(const TInt32& aParam)
hgs
parents:
diff changeset
   669
    {
hgs
parents:
diff changeset
   670
    if( iRequestObserver != NULL )
hgs
parents:
diff changeset
   671
        {
hgs
parents:
diff changeset
   672
        iRequestObserver->UpdatePresentation (aParam);
hgs
parents:
diff changeset
   673
        }
hgs
parents:
diff changeset
   674
    }
hgs
parents:
diff changeset
   675
    
hgs
parents:
diff changeset
   676
    
hgs
parents:
diff changeset
   677
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
   678
// SetRenderingQuality
hgs
parents:
diff changeset
   679
//
hgs
parents:
diff changeset
   680
// @param : aRenderQuality
hgs
parents:
diff changeset
   681
// The function is called from JSR226 API. Specific to M2G/JSR226 only.
hgs
parents:
diff changeset
   682
//---------------------------------------------------------------------------
hgs
parents:
diff changeset
   683
void  CSvgEngineImpl::SetRenderingQuality( const TInt32 aRenderQuality)
hgs
parents:
diff changeset
   684
{
hgs
parents:
diff changeset
   685
	// Bydefault iRenderQuality is set to 2 i.e. Rendering Quality high.
hgs
parents:
diff changeset
   686
	
hgs
parents:
diff changeset
   687
	if( iRenderQuality != aRenderQuality )
hgs
parents:
diff changeset
   688
	{
hgs
parents:
diff changeset
   689
		iRenderQuality = aRenderQuality;
hgs
parents:
diff changeset
   690
		
hgs
parents:
diff changeset
   691
		if( iGfxContext )
hgs
parents:
diff changeset
   692
		{
hgs
parents:
diff changeset
   693
			iGfxContext->SetAntialiasingMode( iRenderQuality );
hgs
parents:
diff changeset
   694
		}
hgs
parents:
diff changeset
   695
	}
hgs
parents:
diff changeset
   696
}
hgs
parents:
diff changeset
   697
hgs
parents:
diff changeset
   698
hgs
parents:
diff changeset
   699
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   700
// Invalidate the current raster (and frame buffer) and
hgs
parents:
diff changeset
   701
// update the buffer with new  raster.
hgs
parents:
diff changeset
   702
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   703
void CSvgEngineImpl::RedrawL()
hgs
parents:
diff changeset
   704
    {
hgs
parents:
diff changeset
   705
    // Clear the frame buffer
hgs
parents:
diff changeset
   706
    if( iGfxContext && iSvgDocument)
hgs
parents:
diff changeset
   707
        {
hgs
parents:
diff changeset
   708
        // Set Clipping rectangle
hgs
parents:
diff changeset
   709
        CSvgSvgElementImpl* el  = ( CSvgSvgElementImpl* ) (iSvgDocument->RootElement());
hgs
parents:
diff changeset
   710
        if ( !el )
hgs
parents:
diff changeset
   711
            {
hgs
parents:
diff changeset
   712
            return; // No DOM tree, nothing to draw.
hgs
parents:
diff changeset
   713
            }
hgs
parents:
diff changeset
   714
            
hgs
parents:
diff changeset
   715
            
hgs
parents:
diff changeset
   716
        
hgs
parents:
diff changeset
   717
     	// If viewBox has been set and width or height is zero
hgs
parents:
diff changeset
   718
     	// Do not render the content    
hgs
parents:
diff changeset
   719
        TGfxRectangle2D viewBoxRect;    
hgs
parents:
diff changeset
   720
        if(el->GetViewBox(viewBoxRect))
hgs
parents:
diff changeset
   721
            {
hgs
parents:
diff changeset
   722
                if(viewBoxRect.iWidth == TFloatFixPt(0) || 
hgs
parents:
diff changeset
   723
                    viewBoxRect.iHeight == TFloatFixPt(0))
hgs
parents:
diff changeset
   724
                    {
hgs
parents:
diff changeset
   725
                    return;
hgs
parents:
diff changeset
   726
                    }
hgs
parents:
diff changeset
   727
            }
hgs
parents:
diff changeset
   728
           
hgs
parents:
diff changeset
   729
        iGfxContext->SetupContextL();
hgs
parents:
diff changeset
   730
        iGfxContext->Clear(iBackgroundColor);
hgs
parents:
diff changeset
   731
        iGfxContext->SetFillOpacity( 1.0f );
hgs
parents:
diff changeset
   732
        iGfxContext->SetStrokeOpacity( 1.0f );
hgs
parents:
diff changeset
   733
hgs
parents:
diff changeset
   734
        TFloatFixPt  width, height;
hgs
parents:
diff changeset
   735
        el->GetAttributeFloat( KAtrWidth, width );
hgs
parents:
diff changeset
   736
        el->GetAttributeFloat( KAtrHeight, height );
hgs
parents:
diff changeset
   737
        TGfxRectangle2D clipRect    ( 0, 0, width, height );
hgs
parents:
diff changeset
   738
        iGfxContext->SetClip( clipRect );
hgs
parents:
diff changeset
   739
        iClipRect = clipRect;
hgs
parents:
diff changeset
   740
hgs
parents:
diff changeset
   741
        UpdateCTM(iSvgDocument);
hgs
parents:
diff changeset
   742
hgs
parents:
diff changeset
   743
        iSvgDocument->iIsRendering = ETrue;
hgs
parents:
diff changeset
   744
        DrawElementsL( (CSvgElementImpl*)iSvgDocument->RootElement());
hgs
parents:
diff changeset
   745
        iSvgDocument->iIsRendering = EFalse;
hgs
parents:
diff changeset
   746
hgs
parents:
diff changeset
   747
        iGfxContext->Flush();
hgs
parents:
diff changeset
   748
hgs
parents:
diff changeset
   749
        // Get the redering result onto CFbsBitmap.
hgs
parents:
diff changeset
   750
        if(iFrameBufferSize.iWidth > 0)
hgs
parents:
diff changeset
   751
            iGfxContext->UpdateFramebufferL( iFrameBuffer, iMask,iFrameBufferSize,iRenderDspMode,iMaskDspMode );    
hgs
parents:
diff changeset
   752
        else
hgs
parents:
diff changeset
   753
         iGfxContext->UpdateFramebufferL( iFrameBuffer, iMask );
hgs
parents:
diff changeset
   754
hgs
parents:
diff changeset
   755
        if ( !iIgnoreUpdateScreen && iRequestObserver != NULL )
hgs
parents:
diff changeset
   756
            {
hgs
parents:
diff changeset
   757
            iRequestObserver->UpdateScreen();
hgs
parents:
diff changeset
   758
            }
hgs
parents:
diff changeset
   759
        if ( iSvgDocument->iInitSortList )
hgs
parents:
diff changeset
   760
            {
hgs
parents:
diff changeset
   761
            iSvgDocument->SortEventList();
hgs
parents:
diff changeset
   762
            }
hgs
parents:
diff changeset
   763
        else
hgs
parents:
diff changeset
   764
            {
hgs
parents:
diff changeset
   765
            iSvgDocument->iInitSortList=EFalse;
hgs
parents:
diff changeset
   766
            }
hgs
parents:
diff changeset
   767
        }
hgs
parents:
diff changeset
   768
    }
hgs
parents:
diff changeset
   769
hgs
parents:
diff changeset
   770
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   771
// Delete the objects associated with the last loaded SVG file
hgs
parents:
diff changeset
   772
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   773
void CSvgEngineImpl::Destroy()
hgs
parents:
diff changeset
   774
    {
hgs
parents:
diff changeset
   775
    //if ( iSvgDocument )    
hgs
parents:
diff changeset
   776
    //    {
hgs
parents:
diff changeset
   777
        // Stop timer and reset time
hgs
parents:
diff changeset
   778
    //    iSvgDocument->TimeContainer()->UserStop();
hgs
parents:
diff changeset
   779
    //    iSvgDocument->TimeContainer()->UserResetTime();
hgs
parents:
diff changeset
   780
    //    }
hgs
parents:
diff changeset
   781
    }
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
hgs
parents:
diff changeset
   784
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   785
// Set the URI information
hgs
parents:
diff changeset
   786
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   787
void CSvgEngineImpl::LinkRequest( const TDesC& aUri )
hgs
parents:
diff changeset
   788
    {
hgs
parents:
diff changeset
   789
    iLinkUri.Set( aUri );
hgs
parents:
diff changeset
   790
    }
hgs
parents:
diff changeset
   791
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   792
// Set the Link:Show information
hgs
parents:
diff changeset
   793
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   794
hgs
parents:
diff changeset
   795
hgs
parents:
diff changeset
   796
void CSvgEngineImpl::LinkRequestWithShow(const TDesC& aUri ,const TDesC& aLinkShow )
hgs
parents:
diff changeset
   797
    {
hgs
parents:
diff changeset
   798
    iLinkUri.Set( aUri );
hgs
parents:
diff changeset
   799
    iLinkShow.Set( aLinkShow );
hgs
parents:
diff changeset
   800
    }
hgs
parents:
diff changeset
   801
hgs
parents:
diff changeset
   802
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   803
// Initiate the process of getting an svg font from the client
hgs
parents:
diff changeset
   804
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   805
TBool CSvgEngineImpl::FetchFont( const TDesC& aUri, RFs& aSession, RFile& aFileHandle )
hgs
parents:
diff changeset
   806
    {
hgs
parents:
diff changeset
   807
		if ( iRequestObserver == NULL )
hgs
parents:
diff changeset
   808
        {
hgs
parents:
diff changeset
   809
        return EFalse;
hgs
parents:
diff changeset
   810
        }
hgs
parents:
diff changeset
   811
    else
hgs
parents:
diff changeset
   812
        {
hgs
parents:
diff changeset
   813
        if (iRequestObserver->FetchFont( aUri, aSession, aFileHandle ) == KErrNone)
hgs
parents:
diff changeset
   814
        {
hgs
parents:
diff changeset
   815
            return ETrue;
hgs
parents:
diff changeset
   816
        }
hgs
parents:
diff changeset
   817
            return EFalse;
hgs
parents:
diff changeset
   818
        }
hgs
parents:
diff changeset
   819
    }
hgs
parents:
diff changeset
   820
hgs
parents:
diff changeset
   821
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   822
// Initiate the process of getting an embedded image from the client
hgs
parents:
diff changeset
   823
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   824
TBool CSvgEngineImpl::FetchImage( const TDesC& aUri, RFs& aSession, RFile& aFileHandle )
hgs
parents:
diff changeset
   825
    {
hgs
parents:
diff changeset
   826
    if ( iRequestObserver == NULL )
hgs
parents:
diff changeset
   827
        {
hgs
parents:
diff changeset
   828
        return EFalse;
hgs
parents:
diff changeset
   829
        }
hgs
parents:
diff changeset
   830
    else
hgs
parents:
diff changeset
   831
        {
hgs
parents:
diff changeset
   832
        if (iRequestObserver->FetchImage( aUri, aSession, aFileHandle ) == KErrNone)
hgs
parents:
diff changeset
   833
        {
hgs
parents:
diff changeset
   834
            return ETrue;
hgs
parents:
diff changeset
   835
        }
hgs
parents:
diff changeset
   836
            return EFalse;
hgs
parents:
diff changeset
   837
        }
hgs
parents:
diff changeset
   838
    }
hgs
parents:
diff changeset
   839
hgs
parents:
diff changeset
   840
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   841
// Accessor for Graphics Context object
hgs
parents:
diff changeset
   842
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   843
CGfx2dGc* CSvgEngineImpl::GraphicsContext()
hgs
parents:
diff changeset
   844
    {
hgs
parents:
diff changeset
   845
    return iGfxContext;
hgs
parents:
diff changeset
   846
    }
hgs
parents:
diff changeset
   847
hgs
parents:
diff changeset
   848
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   849
// Accessor for the Engine's current time
hgs
parents:
diff changeset
   850
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   851
TInt32 CSvgEngineImpl::CurrentTIme()
hgs
parents:
diff changeset
   852
    {
hgs
parents:
diff changeset
   853
    if ( iSvgDocument )
hgs
parents:
diff changeset
   854
        {
hgs
parents:
diff changeset
   855
        return iSvgDocument->CurrentTime();        
hgs
parents:
diff changeset
   856
        }
hgs
parents:
diff changeset
   857
    return KErrGeneral;
hgs
parents:
diff changeset
   858
    }
hgs
parents:
diff changeset
   859
hgs
parents:
diff changeset
   860
hgs
parents:
diff changeset
   861
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   862
// void CSvgEngineImpl::ImageLoadingCompleted( TInt /* aErrorStatus */ )
hgs
parents:
diff changeset
   863
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   864
// ImageLoadingObserver interface
hgs
parents:
diff changeset
   865
void CSvgEngineImpl::ImageLoadingCompleted( TInt /* aErrorStatus */ )
hgs
parents:
diff changeset
   866
{
hgs
parents:
diff changeset
   867
    TRAP_IGNORE(RedrawL());
hgs
parents:
diff changeset
   868
    //aErrorStatus = 0;
hgs
parents:
diff changeset
   869
}
hgs
parents:
diff changeset
   870
hgs
parents:
diff changeset
   871
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   872
// void CSvgEngineImpl::UpdatePath( CGfxGeneralPath* hPath, CSvgElementImpl* hElement )
hgs
parents:
diff changeset
   873
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   874
void CSvgEngineImpl::UpdatePath( CGfxGeneralPath* hPath, CSvgElementImpl* hElement )
hgs
parents:
diff changeset
   875
{
hgs
parents:
diff changeset
   876
    if ((hElement != NULL) && (hElement->ElemID() == KSvgPathElement))
hgs
parents:
diff changeset
   877
    {
hgs
parents:
diff changeset
   878
        TRAPD(error,hElement->SetAttributePathL(KAtrData, hPath));
hgs
parents:
diff changeset
   879
        if ( error != KErrNone )
hgs
parents:
diff changeset
   880
           {
hgs
parents:
diff changeset
   881
            // Error Processing
hgs
parents:
diff changeset
   882
            return;
hgs
parents:
diff changeset
   883
           }
hgs
parents:
diff changeset
   884
    }
hgs
parents:
diff changeset
   885
hgs
parents:
diff changeset
   886
}
hgs
parents:
diff changeset
   887
hgs
parents:
diff changeset
   888
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   889
// Accessor for the document object for the currently loaded SVG source
hgs
parents:
diff changeset
   890
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   891
CSvgDocumentImpl* CSvgEngineImpl::Document()
hgs
parents:
diff changeset
   892
    {
hgs
parents:
diff changeset
   893
    return iSvgDocument;
hgs
parents:
diff changeset
   894
    }
hgs
parents:
diff changeset
   895
hgs
parents:
diff changeset
   896
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   897
// Restrict Thumbnail documents
hgs
parents:
diff changeset
   898
// Do not render to frame buffer when is in thumbnail mode and
hgs
parents:
diff changeset
   899
// frame buffer size width or height is larger than 80x80.
hgs
parents:
diff changeset
   900
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   901
TBool CSvgEngineImpl::PassesThumbNailRestriction()
hgs
parents:
diff changeset
   902
{
hgs
parents:
diff changeset
   903
    if ( iSvgDocument && iFrameBuffer && iSvgDocument->IsThumbNailOnly() )
hgs
parents:
diff changeset
   904
    {
hgs
parents:
diff changeset
   905
        TSize size = iFrameBuffer->SizeInPixels();
hgs
parents:
diff changeset
   906
        if ( size.iWidth > 80 || size.iHeight > 80 )
hgs
parents:
diff changeset
   907
        {
hgs
parents:
diff changeset
   908
           return EFalse;
hgs
parents:
diff changeset
   909
        }
hgs
parents:
diff changeset
   910
    }
hgs
parents:
diff changeset
   911
    return ETrue;
hgs
parents:
diff changeset
   912
}
hgs
parents:
diff changeset
   913
hgs
parents:
diff changeset
   914
//***************************************************************
hgs
parents:
diff changeset
   915
// Event handling
hgs
parents:
diff changeset
   916
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   917
// Initiate the process of handling an event from the client for the
hgs
parents:
diff changeset
   918
// SVG source
hgs
parents:
diff changeset
   919
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   920
void CSvgEngineImpl::ProcessEventL( CSvgDocumentImpl* aSvgDocument, 
hgs
parents:
diff changeset
   921
    MSvgEvent* aEvent, TBool aRedraw )
hgs
parents:
diff changeset
   922
    {
hgs
parents:
diff changeset
   923
    // Check for Thumbnail restrictions
hgs
parents:
diff changeset
   924
    if ( !PassesThumbNailRestriction() )
hgs
parents:
diff changeset
   925
    {
hgs
parents:
diff changeset
   926
        return;
hgs
parents:
diff changeset
   927
    }
hgs
parents:
diff changeset
   928
hgs
parents:
diff changeset
   929
    // Timer event
hgs
parents:
diff changeset
   930
    //if(!aEvent || !iGfxContext)
hgs
parents:
diff changeset
   931
    if(!aEvent)
hgs
parents:
diff changeset
   932
    return;
hgs
parents:
diff changeset
   933
    if ( aEvent->EventType() == ESvgEngineEventTimer )
hgs
parents:
diff changeset
   934
        {
hgs
parents:
diff changeset
   935
        // Update current time
hgs
parents:
diff changeset
   936
        if ( aSvgDocument )
hgs
parents:
diff changeset
   937
            {
hgs
parents:
diff changeset
   938
            aSvgDocument->SetCurrentTime( 
hgs
parents:
diff changeset
   939
                ( ( MSvgTimerEvent * ) aEvent )->Time() );
hgs
parents:
diff changeset
   940
            }
hgs
parents:
diff changeset
   941
        }
hgs
parents:
diff changeset
   942
hgs
parents:
diff changeset
   943
    if( aSvgDocument &&  aSvgDocument->iEventHandler)
hgs
parents:
diff changeset
   944
        {
hgs
parents:
diff changeset
   945
        if (( aSvgDocument->iEventHandler->ProcessEventL( aEvent ) ||
hgs
parents:
diff changeset
   946
              aSvgDocument->iInitialDrawFlag) && aEvent->EventType() == ESvgEngineEventTimer )
hgs
parents:
diff changeset
   947
        {
hgs
parents:
diff changeset
   948
hgs
parents:
diff changeset
   949
      if(aSvgDocument->iInitSortList)
hgs
parents:
diff changeset
   950
            {
hgs
parents:
diff changeset
   951
            aSvgDocument->SortEventList();
hgs
parents:
diff changeset
   952
            aSvgDocument->iInitSortList = EFalse;
hgs
parents:
diff changeset
   953
            }
hgs
parents:
diff changeset
   954
        aSvgDocument->iInitialDrawFlag = EFalse;
hgs
parents:
diff changeset
   955
        aSvgDocument->iEventHandler->DoAnimProcL(aEvent);
hgs
parents:
diff changeset
   956
hgs
parents:
diff changeset
   957
        if (aRedraw)
hgs
parents:
diff changeset
   958
            {
hgs
parents:
diff changeset
   959
        	// Redraw is performed for iSvgDocument
hgs
parents:
diff changeset
   960
            RedrawL();
hgs
parents:
diff changeset
   961
            }
hgs
parents:
diff changeset
   962
        }
hgs
parents:
diff changeset
   963
        else
hgs
parents:
diff changeset
   964
            {
hgs
parents:
diff changeset
   965
        // this is to keep the dom in its final state.
hgs
parents:
diff changeset
   966
            if(aEvent->EventType() == ESvgEngineEventTimer)
hgs
parents:
diff changeset
   967
                {
hgs
parents:
diff changeset
   968
                aSvgDocument->iEventHandler->DoAnimProcL(aEvent);
hgs
parents:
diff changeset
   969
                }
hgs
parents:
diff changeset
   970
hgs
parents:
diff changeset
   971
            }
hgs
parents:
diff changeset
   972
hgs
parents:
diff changeset
   973
    // Process Link
hgs
parents:
diff changeset
   974
    if ( aEvent->EventMask() == KSvgEventMaskExternalUI )
hgs
parents:
diff changeset
   975
            {
hgs
parents:
diff changeset
   976
            if ( iLinkUri.Length() > 0 )
hgs
parents:
diff changeset
   977
                {
hgs
parents:
diff changeset
   978
                DoHyperLinkingL();
hgs
parents:
diff changeset
   979
                // reset link description
hgs
parents:
diff changeset
   980
                iLinkUri.Set( NullString );
hgs
parents:
diff changeset
   981
                }
hgs
parents:
diff changeset
   982
            }
hgs
parents:
diff changeset
   983
        }
hgs
parents:
diff changeset
   984
hgs
parents:
diff changeset
   985
// Show FPS debug info. note. only write data to STI port
hgs
parents:
diff changeset
   986
#ifdef _DEBUG
hgs
parents:
diff changeset
   987
hgs
parents:
diff changeset
   988
    if ( aEvent->EventType() == ESvgEngineInternalEvent )
hgs
parents:
diff changeset
   989
        {
hgs
parents:
diff changeset
   990
        MSvgInternalEvent*  evt = ( MSvgInternalEvent* ) aEvent;
hgs
parents:
diff changeset
   991
        if (evt->SvgEvent() == ESvgEventEndEvent)
hgs
parents:
diff changeset
   992
            {
hgs
parents:
diff changeset
   993
            iAnimationState = KAnimFinished;
hgs
parents:
diff changeset
   994
            return;
hgs
parents:
diff changeset
   995
            }
hgs
parents:
diff changeset
   996
        else
hgs
parents:
diff changeset
   997
        if (evt->SvgEvent() == ESvgEventBeginEvent)
hgs
parents:
diff changeset
   998
            {
hgs
parents:
diff changeset
   999
            iAnimationState = KAnimActive;
hgs
parents:
diff changeset
  1000
            return;
hgs
parents:
diff changeset
  1001
            }
hgs
parents:
diff changeset
  1002
hgs
parents:
diff changeset
  1003
        }
hgs
parents:
diff changeset
  1004
hgs
parents:
diff changeset
  1005
    // time display for debug
hgs
parents:
diff changeset
  1006
    if ( iShowDebugInfo && iGfxContext && aEvent->EventType() == ESvgEngineEventTimer
hgs
parents:
diff changeset
  1007
        && iAnimationState != KAnimFinished /*&& iTimer*/)
hgs
parents:
diff changeset
  1008
        {
hgs
parents:
diff changeset
  1009
        TInt fps = iSvgDocument->TimeContainer()->UserFps() / 10; //iTimer->Fps() / 10;
hgs
parents:
diff changeset
  1010
        _LIT(msg, "\n%3d.%d\n");
hgs
parents:
diff changeset
  1011
        RDebug::Print(msg, fps, iSvgDocument->TimeContainer()->UserFps()
hgs
parents:
diff changeset
  1012
             - fps * 10 );
hgs
parents:
diff changeset
  1013
hgs
parents:
diff changeset
  1014
        }
hgs
parents:
diff changeset
  1015
#endif //_DEBUG
hgs
parents:
diff changeset
  1016
hgs
parents:
diff changeset
  1017
    }
hgs
parents:
diff changeset
  1018
hgs
parents:
diff changeset
  1019
hgs
parents:
diff changeset
  1020
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1021
// This method is for future extension, in which an external script engine
hgs
parents:
diff changeset
  1022
// could be used to evaluate a script description.
hgs
parents:
diff changeset
  1023
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1024
TBool CSvgEngineImpl::ScriptCall( const TDesC& aScript,
hgs
parents:
diff changeset
  1025
                                  CSvgElementImpl* aCallerElement )
hgs
parents:
diff changeset
  1026
    {
hgs
parents:
diff changeset
  1027
    if ( iRequestObserver == NULL )
hgs
parents:
diff changeset
  1028
        {
hgs
parents:
diff changeset
  1029
        return EFalse;
hgs
parents:
diff changeset
  1030
        }
hgs
parents:
diff changeset
  1031
    else
hgs
parents:
diff changeset
  1032
        {
hgs
parents:
diff changeset
  1033
        return iRequestObserver->ScriptCall( aScript, aCallerElement );
hgs
parents:
diff changeset
  1034
        }
hgs
parents:
diff changeset
  1035
    }
hgs
parents:
diff changeset
  1036
hgs
parents:
diff changeset
  1037
hgs
parents:
diff changeset
  1038
//***************************************************************
hgs
parents:
diff changeset
  1039
//
hgs
parents:
diff changeset
  1040
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1041
// Obtain the longest duration for an animation given document
hgs
parents:
diff changeset
  1042
// NULL will assume the attached document.
hgs
parents:
diff changeset
  1043
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1044
TUint32 CSvgEngineImpl::Duration( CSvgDocumentImpl* aDocument )
hgs
parents:
diff changeset
  1045
    {
hgs
parents:
diff changeset
  1046
    if ( aDocument == NULL )
hgs
parents:
diff changeset
  1047
        {
hgs
parents:
diff changeset
  1048
        if ( iSvgDocument == NULL )
hgs
parents:
diff changeset
  1049
            {
hgs
parents:
diff changeset
  1050
            return 0;
hgs
parents:
diff changeset
  1051
            }
hgs
parents:
diff changeset
  1052
        return iSvgDocument->AnimationDuration();
hgs
parents:
diff changeset
  1053
        }
hgs
parents:
diff changeset
  1054
    return aDocument->AnimationDuration();
hgs
parents:
diff changeset
  1055
    }
hgs
parents:
diff changeset
  1056
hgs
parents:
diff changeset
  1057
//*******************************************************/
hgs
parents:
diff changeset
  1058
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1059
// void CSvgEngineImpl::SwitchDebugInfo()
hgs
parents:
diff changeset
  1060
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1061
void CSvgEngineImpl::SwitchDebugInfo(TBool debug)
hgs
parents:
diff changeset
  1062
    {
hgs
parents:
diff changeset
  1063
    iShowDebugInfo = debug;
hgs
parents:
diff changeset
  1064
    }
hgs
parents:
diff changeset
  1065
hgs
parents:
diff changeset
  1066
void CSvgEngineImpl::CustomOption(TBool aCustomOption )
hgs
parents:
diff changeset
  1067
    {
hgs
parents:
diff changeset
  1068
        iCustomOption = aCustomOption;
hgs
parents:
diff changeset
  1069
        delete iGfxContext;
hgs
parents:
diff changeset
  1070
        iGfxContext = NULL;
hgs
parents:
diff changeset
  1071
        
hgs
parents:
diff changeset
  1072
/*NGA reverse*/  TRAP_IGNORE( iGfxContext = CGfx2dGcOpenVG::NewL( iFrameBufferSize, iBitmapFontSpec, iSvgBitmapFontProvider ));            
hgs
parents:
diff changeset
  1073
            
hgs
parents:
diff changeset
  1074
           
hgs
parents:
diff changeset
  1075
    }
hgs
parents:
diff changeset
  1076
hgs
parents:
diff changeset
  1077
hgs
parents:
diff changeset
  1078
hgs
parents:
diff changeset
  1079
hgs
parents:
diff changeset
  1080
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1081
// Initiate the process of opening and reading an embedded hyperlink
hgs
parents:
diff changeset
  1082
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1083
void CSvgEngineImpl::DoHyperLinkingL()
hgs
parents:
diff changeset
  1084
    {
hgs
parents:
diff changeset
  1085
hgs
parents:
diff changeset
  1086
    if( iSvgDocument == NULL )
hgs
parents:
diff changeset
  1087
        return;
hgs
parents:
diff changeset
  1088
hgs
parents:
diff changeset
  1089
    // Not full support of XPointer
hgs
parents:
diff changeset
  1090
hgs
parents:
diff changeset
  1091
    _LIT( KTmpHttp, "http:" );
hgs
parents:
diff changeset
  1092
    _LIT( KTmpFile, "file:" );
hgs
parents:
diff changeset
  1093
    _LIT( KTmpHash, "#" );
hgs
parents:
diff changeset
  1094
    _LIT( KTmpSvgView, "SvgView" );
hgs
parents:
diff changeset
  1095
    if ( iLinkUri.Left( 1 ) == KTmpHash )
hgs
parents:
diff changeset
  1096
        {
hgs
parents:
diff changeset
  1097
        // internal linking
hgs
parents:
diff changeset
  1098
        // Extract id
hgs
parents:
diff changeset
  1099
        TLex    lex ( iLinkUri );
hgs
parents:
diff changeset
  1100
        lex.Inc();  // skip '#'
hgs
parents:
diff changeset
  1101
        lex.Mark();
hgs
parents:
diff changeset
  1102
        while ( !lex.Eos() && lex.Peek().IsAlpha() )
hgs
parents:
diff changeset
  1103
            lex.Inc();
hgs
parents:
diff changeset
  1104
        TPtrC   targetId    = lex.MarkedToken();
hgs
parents:
diff changeset
  1105
        if ( targetId == KTmpSvgView )
hgs
parents:
diff changeset
  1106
            {
hgs
parents:
diff changeset
  1107
            // need to parse next token = {viewBoxSpec| preserveAspectRatioSpec
hgs
parents:
diff changeset
  1108
            // |transformSpec|zoomAndPanSpec|viewTargetSpec}
hgs
parents:
diff changeset
  1109
hgs
parents:
diff changeset
  1110
            // Not yet supported
hgs
parents:
diff changeset
  1111
            }
hgs
parents:
diff changeset
  1112
        else
hgs
parents:
diff changeset
  1113
            {
hgs
parents:
diff changeset
  1114
hgs
parents:
diff changeset
  1115
            CSvgElementImpl*targetElement   = ( CSvgElementImpl* )
hgs
parents:
diff changeset
  1116
                                              iSvgDocument->GetElementById( targetId );
hgs
parents:
diff changeset
  1117
            if ( targetElement == NULL )
hgs
parents:
diff changeset
  1118
                return;
hgs
parents:
diff changeset
  1119
            
hgs
parents:
diff changeset
  1120
            if  (   targetElement->IsAnimatedElement( ) )
hgs
parents:
diff changeset
  1121
                {
hgs
parents:
diff changeset
  1122
                // start animation
hgs
parents:
diff changeset
  1123
                ( ( CSvgAnimationBase * ) targetElement )->BeginElementL();
hgs
parents:
diff changeset
  1124
                }
hgs
parents:
diff changeset
  1125
            else
hgs
parents:
diff changeset
  1126
                {
hgs
parents:
diff changeset
  1127
                }
hgs
parents:
diff changeset
  1128
            }
hgs
parents:
diff changeset
  1129
        }
hgs
parents:
diff changeset
  1130
    else if ( iLinkUri.Length() >= 5 )
hgs
parents:
diff changeset
  1131
        {
hgs
parents:
diff changeset
  1132
        if ( iLinkUri.Left( 5 ) == KTmpHttp || iLinkUri.Left( 5 ) == KTmpFile )
hgs
parents:
diff changeset
  1133
            {
hgs
parents:
diff changeset
  1134
            // notify observer of desire to follow http link
hgs
parents:
diff changeset
  1135
            NotifyHyperlinkActivated( iLinkUri );
hgs
parents:
diff changeset
  1136
            }
hgs
parents:
diff changeset
  1137
        else
hgs
parents:
diff changeset
  1138
            {
hgs
parents:
diff changeset
  1139
            // notify observer of desire to follow link
hgs
parents:
diff changeset
  1140
            if ( iLinkShow.Length() > 0 )
hgs
parents:
diff changeset
  1141
                NotifyHyperlinkActivatedWithShow( iLinkUri, iLinkShow );
hgs
parents:
diff changeset
  1142
            else
hgs
parents:
diff changeset
  1143
                NotifyHyperlinkActivated( iLinkUri );
hgs
parents:
diff changeset
  1144
            }
hgs
parents:
diff changeset
  1145
        }
hgs
parents:
diff changeset
  1146
    else if ( iLinkUri.Length() > 0 )
hgs
parents:
diff changeset
  1147
        {
hgs
parents:
diff changeset
  1148
        // notify observer of desire to follow link
hgs
parents:
diff changeset
  1149
        if ( iLinkShow.Length() > 0 )
hgs
parents:
diff changeset
  1150
            NotifyHyperlinkActivatedWithShow( iLinkUri, iLinkShow );
hgs
parents:
diff changeset
  1151
        else
hgs
parents:
diff changeset
  1152
            NotifyHyperlinkActivated( iLinkUri );
hgs
parents:
diff changeset
  1153
        }
hgs
parents:
diff changeset
  1154
    }
hgs
parents:
diff changeset
  1155
hgs
parents:
diff changeset
  1156
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1157
// Dump a completed raster to the off screen buffer provided by the
hgs
parents:
diff changeset
  1158
// client
hgs
parents:
diff changeset
  1159
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1160
TInt CSvgEngineImpl::RenderFileToBuffer( const TDesC8& aSvgData,
hgs
parents:
diff changeset
  1161
                                           CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
  1162
                                           CFbsBitmap* aMask,
hgs
parents:
diff changeset
  1163
                                           TBool aPreserveAspectRatio )
hgs
parents:
diff changeset
  1164
    {
hgs
parents:
diff changeset
  1165
    if ( !iGfxContext )
hgs
parents:
diff changeset
  1166
        {
hgs
parents:
diff changeset
  1167
        return EFalse;
hgs
parents:
diff changeset
  1168
        }
hgs
parents:
diff changeset
  1169
hgs
parents:
diff changeset
  1170
    CFbsBitmap* OrgFrameBuffer;
hgs
parents:
diff changeset
  1171
    CFbsBitmap* OrgMask;
hgs
parents:
diff changeset
  1172
	OrgFrameBuffer = iFrameBuffer;
hgs
parents:
diff changeset
  1173
	OrgMask = iMask;
hgs
parents:
diff changeset
  1174
	CSvgDocumentImpl* lsvgorgdoc = iSvgDocument;
hgs
parents:
diff changeset
  1175
	// We have moved all the leaving functions into RenderFileL 
hgs
parents:
diff changeset
  1176
	TRAPD(err,RenderFileL(aSvgData,aFrameBuffer,aMask,aPreserveAspectRatio));
hgs
parents:
diff changeset
  1177
	// No matter what...whether the RenderFileL returns properly or leave we need to set the 
hgs
parents:
diff changeset
  1178
	//GDI context back to the original frame buffer and mask... and set back the engine to
hgs
parents:
diff changeset
  1179
	//how it was before all this happened..
hgs
parents:
diff changeset
  1180
	
hgs
parents:
diff changeset
  1181
    SetDocument(lsvgorgdoc);
hgs
parents:
diff changeset
  1182
    lsvgorgdoc->SetEngine(this);
hgs
parents:
diff changeset
  1183
	// the setGDIContextL error is a very serious error and if it occurs then 
hgs
parents:
diff changeset
  1184
	// there is no way of recovery. 
hgs
parents:
diff changeset
  1185
	TRAP_IGNORE(SetGdiContextL(OrgFrameBuffer,OrgMask));
hgs
parents:
diff changeset
  1186
	//So we are propagating the more probable error of the two which is the leaving of 
hgs
parents:
diff changeset
  1187
	// RenderFileL.
hgs
parents:
diff changeset
  1188
    return err;
hgs
parents:
diff changeset
  1189
    }
hgs
parents:
diff changeset
  1190
    
hgs
parents:
diff changeset
  1191
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1192
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1193
// Helper leaving function for the function RenderFileToBuffer.
hgs
parents:
diff changeset
  1194
// The actual rendering happens in this function..while the calling function uses this to
hgs
parents:
diff changeset
  1195
// render the file.
hgs
parents:
diff changeset
  1196
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1197
    
hgs
parents:
diff changeset
  1198
hgs
parents:
diff changeset
  1199
void CSvgEngineImpl::RenderFileL( const TDesC8& aSvgData,
hgs
parents:
diff changeset
  1200
                                           CFbsBitmap* aFrameBuffer,
hgs
parents:
diff changeset
  1201
                                           CFbsBitmap* aMask,
hgs
parents:
diff changeset
  1202
                                           TBool aPreserveAspectRatio)
hgs
parents:
diff changeset
  1203
   
hgs
parents:
diff changeset
  1204
{
hgs
parents:
diff changeset
  1205
    CFont *lFont = iGfxContext->Font();
hgs
parents:
diff changeset
  1206
    TFontSpec lFontSpec = lFont->FontSpecInTwips();
hgs
parents:
diff changeset
  1207
		
hgs
parents:
diff changeset
  1208
    TSize imageSize;
hgs
parents:
diff changeset
  1209
    imageSize = aFrameBuffer->SizeInPixels();
hgs
parents:
diff changeset
  1210
	//iFrameBuffer = aFrameBuffer;
hgs
parents:
diff changeset
  1211
hgs
parents:
diff changeset
  1212
    SetGdiContextL(aFrameBuffer, aMask);
hgs
parents:
diff changeset
  1213
    CSvgDocumentImpl* lSvgDocument = CSvgDocumentImpl::NewLC(iSvgBitmapFontProvider);
hgs
parents:
diff changeset
  1214
    SetDocument(lSvgDocument);
hgs
parents:
diff changeset
  1215
    lSvgDocument->SetEngine(this);
hgs
parents:
diff changeset
  1216
hgs
parents:
diff changeset
  1217
    // fileHandle is valid from client
hgs
parents:
diff changeset
  1218
    lSvgDocument->Load( aSvgData, *iSvgError );
hgs
parents:
diff changeset
  1219
    if ( iSvgError->HasError() && !iSvgError->IsWarning() )
hgs
parents:
diff changeset
  1220
        {
hgs
parents:
diff changeset
  1221
        CleanupStack::PopAndDestroy(1);
hgs
parents:
diff changeset
  1222
        return;
hgs
parents:
diff changeset
  1223
        }
hgs
parents:
diff changeset
  1224
hgs
parents:
diff changeset
  1225
    StartFrameLoopL();
hgs
parents:
diff changeset
  1226
    CSvgSvgElementImpl* lRoot = (CSvgSvgElementImpl*)lSvgDocument->RootElement();
hgs
parents:
diff changeset
  1227
    _LIT( KPreserveAspectRatio, "preserveAspectRatio" );
hgs
parents:
diff changeset
  1228
hgs
parents:
diff changeset
  1229
    if(lRoot)
hgs
parents:
diff changeset
  1230
        {
hgs
parents:
diff changeset
  1231
        if ( aPreserveAspectRatio )
hgs
parents:
diff changeset
  1232
            {
hgs
parents:
diff changeset
  1233
            _LIT( KXMidYMid, "xMidYMid" );
hgs
parents:
diff changeset
  1234
            lRoot->SetAttributeL( KPreserveAspectRatio, KXMidYMid );
hgs
parents:
diff changeset
  1235
            lRoot->SetWidth( imageSize.iWidth );
hgs
parents:
diff changeset
  1236
            lRoot->SetHeight( imageSize.iHeight );
hgs
parents:
diff changeset
  1237
            }
hgs
parents:
diff changeset
  1238
        else {
hgs
parents:
diff changeset
  1239
            _LIT( KNone, "none" );
hgs
parents:
diff changeset
  1240
            lRoot->SetAttributeL( KPreserveAspectRatio, KNone );
hgs
parents:
diff changeset
  1241
            lRoot->SetWidth( imageSize.iWidth );
hgs
parents:
diff changeset
  1242
            lRoot->SetHeight( imageSize.iHeight );
hgs
parents:
diff changeset
  1243
            }
hgs
parents:
diff changeset
  1244
        RedrawL();
hgs
parents:
diff changeset
  1245
        }
hgs
parents:
diff changeset
  1246
    CleanupStack::PopAndDestroy( 1 );
hgs
parents:
diff changeset
  1247
}
hgs
parents:
diff changeset
  1248
    
hgs
parents:
diff changeset
  1249
hgs
parents:
diff changeset
  1250
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1251
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1252
// Generate a mask bitmap from alpha channel of the framebuffer.
hgs
parents:
diff changeset
  1253
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1254
void CSvgEngineImpl::GenerateMask(CFbsBitmap* aMask)
hgs
parents:
diff changeset
  1255
    {
hgs
parents:
diff changeset
  1256
    if ( iGfxContext )
hgs
parents:
diff changeset
  1257
        {
hgs
parents:
diff changeset
  1258
        iGfxContext->GenerateMask( aMask );
hgs
parents:
diff changeset
  1259
        }
hgs
parents:
diff changeset
  1260
    }
hgs
parents:
diff changeset
  1261
hgs
parents:
diff changeset
  1262
//
hgs
parents:
diff changeset
  1263
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1264
// set background color
hgs
parents:
diff changeset
  1265
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1266
void CSvgEngineImpl::SetBackgroundColor(TUint32 aRGBA8888Color)
hgs
parents:
diff changeset
  1267
    {
hgs
parents:
diff changeset
  1268
    iBackgroundColor = aRGBA8888Color;
hgs
parents:
diff changeset
  1269
    }
hgs
parents:
diff changeset
  1270
hgs
parents:
diff changeset
  1271
//
hgs
parents:
diff changeset
  1272
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1273
// Get Size of render buffer
hgs
parents:
diff changeset
  1274
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1275
TSize CSvgEngineImpl::GetSize()
hgs
parents:
diff changeset
  1276
    {
hgs
parents:
diff changeset
  1277
    	  return iFrameBufferSize;
hgs
parents:
diff changeset
  1278
    	  
hgs
parents:
diff changeset
  1279
hgs
parents:
diff changeset
  1280
        
hgs
parents:
diff changeset
  1281
    }
hgs
parents:
diff changeset
  1282
hgs
parents:
diff changeset
  1283
hgs
parents:
diff changeset
  1284
//
hgs
parents:
diff changeset
  1285
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1286
// Return SVG Engine State
hgs
parents:
diff changeset
  1287
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1288
hgs
parents:
diff changeset
  1289
TSvgEngineState CSvgEngineImpl::SVGEngineState()
hgs
parents:
diff changeset
  1290
    {
hgs
parents:
diff changeset
  1291
    return iSvgEngineState;
hgs
parents:
diff changeset
  1292
    }
hgs
parents:
diff changeset
  1293
hgs
parents:
diff changeset
  1294
//
hgs
parents:
diff changeset
  1295
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1296
// Set SVG Engine State
hgs
parents:
diff changeset
  1297
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1298
hgs
parents:
diff changeset
  1299
void CSvgEngineImpl::SetSVGEngineState(TSvgEngineState aState)
hgs
parents:
diff changeset
  1300
    {
hgs
parents:
diff changeset
  1301
    iSvgEngineState = aState;
hgs
parents:
diff changeset
  1302
    if( iSvgEngineState == ESVGEnginePaused )
hgs
parents:
diff changeset
  1303
        {
hgs
parents:
diff changeset
  1304
        if ( iSvgDocument )
hgs
parents:
diff changeset
  1305
        	{
hgs
parents:
diff changeset
  1306
            iSvgDocument->TimeContainer()->UserPause();
hgs
parents:
diff changeset
  1307
            NotifyAnimationPaused();
hgs
parents:
diff changeset
  1308
        	}
hgs
parents:
diff changeset
  1309
        }
hgs
parents:
diff changeset
  1310
    else if( iSvgEngineState == ESVGEngineRunning )
hgs
parents:
diff changeset
  1311
        {
hgs
parents:
diff changeset
  1312
        if (iSvgDocument && iSvgDocument->IsAnimationFile())
hgs
parents:
diff changeset
  1313
            {
hgs
parents:
diff changeset
  1314
           	iSvgDocument->TimeContainer()->UserResume();	
hgs
parents:
diff changeset
  1315
            }
hgs
parents:
diff changeset
  1316
        }
hgs
parents:
diff changeset
  1317
    else if(iSvgEngineState == ESVGEngineStopped ) 
hgs
parents:
diff changeset
  1318
        {
hgs
parents:
diff changeset
  1319
            if ( iSvgDocument )
hgs
parents:
diff changeset
  1320
            {
hgs
parents:
diff changeset
  1321
                iSvgDocument->TimeContainer()->UserStop();
hgs
parents:
diff changeset
  1322
       	    }
hgs
parents:
diff changeset
  1323
     
hgs
parents:
diff changeset
  1324
        }   
hgs
parents:
diff changeset
  1325
    }
hgs
parents:
diff changeset
  1326
hgs
parents:
diff changeset
  1327
void CSvgEngineImpl::SeekEngine( TUint32 aTime)
hgs
parents:
diff changeset
  1328
    {
hgs
parents:
diff changeset
  1329
    iSvgEngineState = ESVGEngineRunning;
hgs
parents:
diff changeset
  1330
    if ( iSvgDocument )
hgs
parents:
diff changeset
  1331
    	{
hgs
parents:
diff changeset
  1332
    	iSvgDocument->TimeContainer()->UserSeek( aTime );
hgs
parents:
diff changeset
  1333
    	}
hgs
parents:
diff changeset
  1334
    }
hgs
parents:
diff changeset
  1335
hgs
parents:
diff changeset
  1336
void CSvgEngineImpl::ResetTimer()
hgs
parents:
diff changeset
  1337
    {
hgs
parents:
diff changeset
  1338
    if ( iSvgDocument )
hgs
parents:
diff changeset
  1339
        {
hgs
parents:
diff changeset
  1340
        iSvgDocument->TimeContainer()->UserResetTime();
hgs
parents:
diff changeset
  1341
        }
hgs
parents:
diff changeset
  1342
    }
hgs
parents:
diff changeset
  1343
hgs
parents:
diff changeset
  1344
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1345
// SetGdiContext File
hgs
parents:
diff changeset
  1346
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1347
hgs
parents:
diff changeset
  1348
void CSvgEngineImpl::SetGdiContextL(CFbsBitmap* aCurrentBitmap, CFbsBitmap* aMask)
hgs
parents:
diff changeset
  1349
    {
hgs
parents:
diff changeset
  1350
    // Handle for both Non-NULL and NULL parameter
hgs
parents:
diff changeset
  1351
    iFrameBuffer = aCurrentBitmap;
hgs
parents:
diff changeset
  1352
    iMask = aMask;
hgs
parents:
diff changeset
  1353
hgs
parents:
diff changeset
  1354
    if ( aCurrentBitmap )
hgs
parents:
diff changeset
  1355
        {
hgs
parents:
diff changeset
  1356
        if ( !iGfxContext )
hgs
parents:
diff changeset
  1357
            {
hgs
parents:
diff changeset
  1358
                iGfxContext = CGfx2dGcOpenVG::NewL( iFrameBuffer->SizeInPixels(), iBitmapFontSpec, iSvgBitmapFontProvider );
hgs
parents:
diff changeset
  1359
                
hgs
parents:
diff changeset
  1360
                // The API is called Only in case of JSR226. Incase if the midlet developer
hgs
parents:
diff changeset
  1361
                // has changed the RedenderQuality of the midlet.ByDefualt the value of 
hgs
parents:
diff changeset
  1362
                // iRenderQuality is 2 i.e. VG_RENDERING_QUALITY_BETTER.
hgs
parents:
diff changeset
  1363
                iGfxContext->SetAntialiasingMode( iRenderQuality );
hgs
parents:
diff changeset
  1364
            }
hgs
parents:
diff changeset
  1365
        else
hgs
parents:
diff changeset
  1366
            {
hgs
parents:
diff changeset
  1367
            iGfxContext->ChangeBufferSizeL( iFrameBuffer->SizeInPixels() );
hgs
parents:
diff changeset
  1368
            }
hgs
parents:
diff changeset
  1369
        }
hgs
parents:
diff changeset
  1370
    else if ( iGfxContext )
hgs
parents:
diff changeset
  1371
        {
hgs
parents:
diff changeset
  1372
        iGfxContext->ChangeBufferSizeL( TSize( 0,0 ) );
hgs
parents:
diff changeset
  1373
        }
hgs
parents:
diff changeset
  1374
    }
hgs
parents:
diff changeset
  1375
hgs
parents:
diff changeset
  1376
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1377
// void CSvgEngineImpl::StartEngine(CSvgErrorImpl* aError)
hgs
parents:
diff changeset
  1378
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1379
hgs
parents:
diff changeset
  1380
void CSvgEngineImpl::StartEngine(CSvgErrorImpl* aError)
hgs
parents:
diff changeset
  1381
    {
hgs
parents:
diff changeset
  1382
    if ( !iFrameBuffer || !iSvgDocument )
hgs
parents:
diff changeset
  1383
        {
hgs
parents:
diff changeset
  1384
        return;
hgs
parents:
diff changeset
  1385
        }
hgs
parents:
diff changeset
  1386
hgs
parents:
diff changeset
  1387
    iMouseoverElement = NULL;
hgs
parents:
diff changeset
  1388
    if ( ((iFrameBufferSize.iHeight <= 0 )||(iFrameBufferSize.iWidth <= 0 )) &&(( iFrameBuffer->SizeInPixels().iWidth == 0 ) ||
hgs
parents:
diff changeset
  1389
         ( iFrameBuffer->SizeInPixels().iHeight == 0) ))
hgs
parents:
diff changeset
  1390
        {
hgs
parents:
diff changeset
  1391
        return;
hgs
parents:
diff changeset
  1392
        }
hgs
parents:
diff changeset
  1393
hgs
parents:
diff changeset
  1394
    TBool initialized = EFalse;
hgs
parents:
diff changeset
  1395
hgs
parents:
diff changeset
  1396
    TRAPD( initError, initialized = StartFrameLoopL() );
hgs
parents:
diff changeset
  1397
hgs
parents:
diff changeset
  1398
    if ( initError != KErrNone || !initialized )
hgs
parents:
diff changeset
  1399
        {
hgs
parents:
diff changeset
  1400
        return;
hgs
parents:
diff changeset
  1401
        }
hgs
parents:
diff changeset
  1402
hgs
parents:
diff changeset
  1403
    // Get the Engine State to Running
hgs
parents:
diff changeset
  1404
    SetSVGEngineState(ESVGEngineRunning);
hgs
parents:
diff changeset
  1405
hgs
parents:
diff changeset
  1406
    // Document is an animation
hgs
parents:
diff changeset
  1407
    if( iSvgDocument->IsAnimationFile() )
hgs
parents:
diff changeset
  1408
        {
hgs
parents:
diff changeset
  1409
            { // Atleast first frame should get drawn
hgs
parents:
diff changeset
  1410
                TRAPD(error, RedrawL() );
hgs
parents:
diff changeset
  1411
                {
hgs
parents:
diff changeset
  1412
                    if ( error != KErrNone && aError != NULL )
hgs
parents:
diff changeset
  1413
                    {
hgs
parents:
diff changeset
  1414
                       if( error == KErrNoMemory )
hgs
parents:
diff changeset
  1415
                       {
hgs
parents:
diff changeset
  1416
                           CSvgDocumentImpl::PrepareError( *aError, ESvgNoMemory, error,
hgs
parents:
diff changeset
  1417
                           _L( "Unable to Draw: " ),
hgs
parents:
diff changeset
  1418
                           _L( "" ) );  
hgs
parents:
diff changeset
  1419
                           return;  
hgs
parents:
diff changeset
  1420
                       }
hgs
parents:
diff changeset
  1421
                       
hgs
parents:
diff changeset
  1422
                       CSvgDocumentImpl::PrepareError( *aError, ESvgUnknown, error,
hgs
parents:
diff changeset
  1423
                       _L( "Unable to Draw: " ),
hgs
parents:
diff changeset
  1424
                       _L( "" ) );  
hgs
parents:
diff changeset
  1425
                       return;
hgs
parents:
diff changeset
  1426
                    }
hgs
parents:
diff changeset
  1427
                }
hgs
parents:
diff changeset
  1428
            
hgs
parents:
diff changeset
  1429
            }
hgs
parents:
diff changeset
  1430
            
hgs
parents:
diff changeset
  1431
        iSvgDocument->TimeContainer()->UserPlay();
hgs
parents:
diff changeset
  1432
        iSvgDocument->iAnimationResetNeeded = ETrue;
hgs
parents:
diff changeset
  1433
        }
hgs
parents:
diff changeset
  1434
    // Static svg file
hgs
parents:
diff changeset
  1435
    else
hgs
parents:
diff changeset
  1436
        {
hgs
parents:
diff changeset
  1437
            TRAPD(error, RedrawL() );
hgs
parents:
diff changeset
  1438
            {
hgs
parents:
diff changeset
  1439
                if ( error != KErrNone && aError != NULL )
hgs
parents:
diff changeset
  1440
                {
hgs
parents:
diff changeset
  1441
                   if( error == KErrNoMemory )
hgs
parents:
diff changeset
  1442
                   {
hgs
parents:
diff changeset
  1443
                       CSvgDocumentImpl::PrepareError( *aError, ESvgNoMemory, error,
hgs
parents:
diff changeset
  1444
                       _L( "Unable to Draw: " ),
hgs
parents:
diff changeset
  1445
                       _L( "" ) );  
hgs
parents:
diff changeset
  1446
                       return;  
hgs
parents:
diff changeset
  1447
                   }
hgs
parents:
diff changeset
  1448
                   
hgs
parents:
diff changeset
  1449
                   CSvgDocumentImpl::PrepareError( *aError, ESvgUnknown, error,
hgs
parents:
diff changeset
  1450
                   _L( "Unable to Draw: " ),
hgs
parents:
diff changeset
  1451
                   _L( "" ) );  
hgs
parents:
diff changeset
  1452
                   return;
hgs
parents:
diff changeset
  1453
                }
hgs
parents:
diff changeset
  1454
            }
hgs
parents:
diff changeset
  1455
        }
hgs
parents:
diff changeset
  1456
    }
hgs
parents:
diff changeset
  1457
hgs
parents:
diff changeset
  1458
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1459
// void CSvgEngineImpl::RenderFrame( TUint aCurrentTime )
hgs
parents:
diff changeset
  1460
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1461
void CSvgEngineImpl::RenderFrame( TUint aCurrentTime )
hgs
parents:
diff changeset
  1462
    {
hgs
parents:
diff changeset
  1463
    if ( !iFrameBuffer || !iSvgDocument ||
hgs
parents:
diff changeset
  1464
         iFrameBuffer->SizeInPixels().iWidth == 0 || iFrameBuffer->SizeInPixels().iHeight == 0 )
hgs
parents:
diff changeset
  1465
        {
hgs
parents:
diff changeset
  1466
        return;
hgs
parents:
diff changeset
  1467
        }
hgs
parents:
diff changeset
  1468
hgs
parents:
diff changeset
  1469
    if ( aCurrentTime == 0 )
hgs
parents:
diff changeset
  1470
        {
hgs
parents:
diff changeset
  1471
        SeekEngine( 0 );
hgs
parents:
diff changeset
  1472
        }
hgs
parents:
diff changeset
  1473
hgs
parents:
diff changeset
  1474
    iMouseoverElement = NULL;
hgs
parents:
diff changeset
  1475
hgs
parents:
diff changeset
  1476
     	CSvgSvgElementImpl* rootElement = (CSvgSvgElementImpl*)iSvgDocument->RootElement();
hgs
parents:
diff changeset
  1477
hgs
parents:
diff changeset
  1478
     	if (rootElement == NULL)
hgs
parents:
diff changeset
  1479
     	{
hgs
parents:
diff changeset
  1480
     		return;
hgs
parents:
diff changeset
  1481
     	}
hgs
parents:
diff changeset
  1482
hgs
parents:
diff changeset
  1483
     	TGfxRectangle2D viewBoxRect;
hgs
parents:
diff changeset
  1484
     	if (rootElement->GetViewBox(viewBoxRect))
hgs
parents:
diff changeset
  1485
     	{
hgs
parents:
diff changeset
  1486
     		//viewbox has been defined or set already
hgs
parents:
diff changeset
  1487
   			if (viewBoxRect.iWidth == TFloatFixPt(0) || viewBoxRect.iHeight == TFloatFixPt(0))
hgs
parents:
diff changeset
  1488
   			{
hgs
parents:
diff changeset
  1489
   				//viewbox has no area so dont render
hgs
parents:
diff changeset
  1490
   				return;
hgs
parents:
diff changeset
  1491
   			}
hgs
parents:
diff changeset
  1492
   		}
hgs
parents:
diff changeset
  1493
hgs
parents:
diff changeset
  1494
    if( iRequestObserver && iSvgDocument->iEventHandler )
hgs
parents:
diff changeset
  1495
        {
hgs
parents:
diff changeset
  1496
        iRequestObserver->UpdatePresentation( iSvgDocument->iEventHandler->AnimationElementsCount() );
hgs
parents:
diff changeset
  1497
        }
hgs
parents:
diff changeset
  1498
hgs
parents:
diff changeset
  1499
    iSvgDocument->iInitialDrawFlag = ETrue;
hgs
parents:
diff changeset
  1500
hgs
parents:
diff changeset
  1501
    // Fix for animation element for testApp   
hgs
parents:
diff changeset
  1502
    TSvgTick lTick;
hgs
parents:
diff changeset
  1503
    lTick.iRealTimeTick = aCurrentTime;
hgs
parents:
diff changeset
  1504
    lTick.iParentTcTick = 0;
hgs
parents:
diff changeset
  1505
    iSvgDocument->TimeContainer()->ParentTimeContainerTick(lTick) ;
hgs
parents:
diff changeset
  1506
    // Fix for animation element for testApp   
hgs
parents:
diff changeset
  1507
    }
hgs
parents:
diff changeset
  1508
hgs
parents:
diff changeset
  1509
hgs
parents:
diff changeset
  1510
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1511
// Set SvgEngine Document
hgs
parents:
diff changeset
  1512
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1513
void CSvgEngineImpl::SetDocument(CSvgDocumentImpl* aDocument)
hgs
parents:
diff changeset
  1514
    {
hgs
parents:
diff changeset
  1515
    iSvgDocument = aDocument;
hgs
parents:
diff changeset
  1516
    }
hgs
parents:
diff changeset
  1517
hgs
parents:
diff changeset
  1518
hgs
parents:
diff changeset
  1519
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1520
// Change the duration of the timer
hgs
parents:
diff changeset
  1521
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1522
void CSvgEngineImpl::ChangeDuration( TUint32 aTimerDuration )
hgs
parents:
diff changeset
  1523
    {
hgs
parents:
diff changeset
  1524
    if ( iSvgDocument )
hgs
parents:
diff changeset
  1525
        {
hgs
parents:
diff changeset
  1526
        iSvgDocument->TimeContainer()->UserChangeFrameDuration( 
hgs
parents:
diff changeset
  1527
            aTimerDuration );
hgs
parents:
diff changeset
  1528
        
hgs
parents:
diff changeset
  1529
        // Check if there is animation element in the parent svg
hgs
parents:
diff changeset
  1530
    RPointerArray<CSvgElementImpl> lAnimationEleList;
hgs
parents:
diff changeset
  1531
    iSvgDocument->FindAllElements((CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1532
               KSvgMediaAnimationElement, lAnimationEleList );
hgs
parents:
diff changeset
  1533
    TInt lAnimationEleCnt = lAnimationEleList.Count();    
hgs
parents:
diff changeset
  1534
    for ( TInt lCurAnimationEle = 0; 
hgs
parents:
diff changeset
  1535
             lCurAnimationEle < lAnimationEleCnt; lCurAnimationEle++ )
hgs
parents:
diff changeset
  1536
        {
hgs
parents:
diff changeset
  1537
        CSvgMediaAnimationElementImpl* lAnimationElement = 
hgs
parents:
diff changeset
  1538
            (CSvgMediaAnimationElementImpl* )lAnimationEleList[ lCurAnimationEle ];
hgs
parents:
diff changeset
  1539
        CSvgDocumentImpl* lChildDoc = lAnimationElement->GetChildDocument();
hgs
parents:
diff changeset
  1540
        if ( lChildDoc )
hgs
parents:
diff changeset
  1541
            {
hgs
parents:
diff changeset
  1542
            lChildDoc->TimeContainer()->UserChangeFrameDuration( 
hgs
parents:
diff changeset
  1543
            aTimerDuration ); // Change Frame duration for child svg
hgs
parents:
diff changeset
  1544
            }
hgs
parents:
diff changeset
  1545
        }
hgs
parents:
diff changeset
  1546
        lAnimationEleList.Close();     
hgs
parents:
diff changeset
  1547
    	}	   
hgs
parents:
diff changeset
  1548
    }
hgs
parents:
diff changeset
  1549
hgs
parents:
diff changeset
  1550
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1551
// void CSvgEngineImpl::Resume(TInt32 aTime)
hgs
parents:
diff changeset
  1552
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1553
void CSvgEngineImpl::Resume(TInt32 aTime)
hgs
parents:
diff changeset
  1554
    {
hgs
parents:
diff changeset
  1555
    if ( iSvgDocument )
hgs
parents:
diff changeset
  1556
        {
hgs
parents:
diff changeset
  1557
        iSvgDocument->TimeContainer()->UserResume( aTime );
hgs
parents:
diff changeset
  1558
        }
hgs
parents:
diff changeset
  1559
    }
hgs
parents:
diff changeset
  1560
hgs
parents:
diff changeset
  1561
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1562
// void CSvgEngineImpl::FindBBoxesForRotatedText( const TDesC& aSearchString,
hgs
parents:
diff changeset
  1563
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1564
void CSvgEngineImpl::FindBBoxesForRotatedText( const TDesC& aSearchString,
hgs
parents:
diff changeset
  1565
                           RPointerArray<MRect>& aBoundingBoxes,
hgs
parents:
diff changeset
  1566
                                        RArray<TPtrC>& aTexts,
hgs
parents:
diff changeset
  1567
                                        RArray<TInt>& aElementIds,
hgs
parents:
diff changeset
  1568
                                        TBool aCaseSensitive )
hgs
parents:
diff changeset
  1569
{
hgs
parents:
diff changeset
  1570
    if ( iSvgDocument == NULL )
hgs
parents:
diff changeset
  1571
        return;
hgs
parents:
diff changeset
  1572
hgs
parents:
diff changeset
  1573
    if ( iSvgTextBoundingBoxes.Count() > 0 )
hgs
parents:
diff changeset
  1574
    {
hgs
parents:
diff changeset
  1575
    	iSvgTextBoundingBoxes.ResetAndDestroy();
hgs
parents:
diff changeset
  1576
    }
hgs
parents:
diff changeset
  1577
hgs
parents:
diff changeset
  1578
    // Find all text elements
hgs
parents:
diff changeset
  1579
	HBufC* searchStr = aSearchString.AllocLC();    
hgs
parents:
diff changeset
  1580
	TPtr searchStrPtr = searchStr->Des();
hgs
parents:
diff changeset
  1581
    RPointerArray<CSvgElementImpl> textElements;
hgs
parents:
diff changeset
  1582
    iSvgDocument->FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1583
                     KSvgTextElement, textElements );
hgs
parents:
diff changeset
  1584
    // Himanshu: Find all animation elements
hgs
parents:
diff changeset
  1585
    RPointerArray<CSvgElementImpl> lAllAnimationElements;                                
hgs
parents:
diff changeset
  1586
    iSvgDocument->FindAllElements( (CSvgElementImpl*)iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1587
                                KSvgMediaAnimationElement,
hgs
parents:
diff changeset
  1588
                                lAllAnimationElements );                                
hgs
parents:
diff changeset
  1589
    TInt lAllAnimationEleCnt = lAllAnimationElements.Count();                            
hgs
parents:
diff changeset
  1590
    for ( TInt i = 0; i < lAllAnimationEleCnt; i++ )
hgs
parents:
diff changeset
  1591
        {
hgs
parents:
diff changeset
  1592
          CSvgMediaAnimationElementImpl* element = (CSvgMediaAnimationElementImpl*)lAllAnimationElements[i];
hgs
parents:
diff changeset
  1593
          CSvgDocumentImpl* ldoc = element->GetChildDocument();
hgs
parents:
diff changeset
  1594
            if(ldoc)
hgs
parents:
diff changeset
  1595
            {
hgs
parents:
diff changeset
  1596
                // Find all text elements in child document
hgs
parents:
diff changeset
  1597
                ldoc->FindAllElements( (CSvgElementImpl*)ldoc->RootElement(),
hgs
parents:
diff changeset
  1598
                                KSvgTextElement,
hgs
parents:
diff changeset
  1599
                                textElements );  
hgs
parents:
diff changeset
  1600
            }
hgs
parents:
diff changeset
  1601
          
hgs
parents:
diff changeset
  1602
        }
hgs
parents:
diff changeset
  1603
        lAllAnimationElements.Close();
hgs
parents:
diff changeset
  1604
hgs
parents:
diff changeset
  1605
    TSvgFourPointRect boundingBox;
hgs
parents:
diff changeset
  1606
    TInt textEleCnt = textElements.Count();
hgs
parents:
diff changeset
  1607
    for ( TInt i = 0; i < textEleCnt; i++ )
hgs
parents:
diff changeset
  1608
    {
hgs
parents:
diff changeset
  1609
        CSvgTextElementImpl* textElement = (CSvgTextElementImpl*)textElements[i];
hgs
parents:
diff changeset
  1610
        TPtrC remainder( textElement->GetText() );
hgs
parents:
diff changeset
  1611
hgs
parents:
diff changeset
  1612
        TInt index = ( aCaseSensitive ) ? remainder.Find( aSearchString ) :
hgs
parents:
diff changeset
  1613
                                          remainder.FindF( aSearchString );
hgs
parents:
diff changeset
  1614
hgs
parents:
diff changeset
  1615
        // continue to next element if nothing found
hgs
parents:
diff changeset
  1616
        if ( index == KErrNotFound )
hgs
parents:
diff changeset
  1617
            continue;
hgs
parents:
diff changeset
  1618
hgs
parents:
diff changeset
  1619
		searchStrPtr.Copy( remainder.Mid(index,aSearchString.Length()) );
hgs
parents:
diff changeset
  1620
        // Get the bounding box for the whole text element
hgs
parents:
diff changeset
  1621
        textElement->GetFourPointBBox( boundingBox );
hgs
parents:
diff changeset
  1622
hgs
parents:
diff changeset
  1623
        // Get bounding box for every occurrence
hgs
parents:
diff changeset
  1624
        TReal32 textAdvance = (TReal32)(textElement->TextAdvance( *searchStr, index ));
hgs
parents:
diff changeset
  1625
        TReal32 leftAdvance = 0.0f;
hgs
parents:
diff changeset
  1626
        //TReal32 aHeight = textElement->Ascent() + textElement->Descent();
hgs
parents:
diff changeset
  1627
hgs
parents:
diff changeset
  1628
        while ( index != KErrNotFound )
hgs
parents:
diff changeset
  1629
        {
hgs
parents:
diff changeset
  1630
            // Calculate boundingbox for searched-text
hgs
parents:
diff changeset
  1631
            // indeterminate results with a string only one character long
hgs
parents:
diff changeset
  1632
            leftAdvance = leftAdvance + (TReal32)(textElement->TextAdvance( remainder.Left( index )));
hgs
parents:
diff changeset
  1633
hgs
parents:
diff changeset
  1634
            // need to setup slope calculation here to determine where the new
hgs
parents:
diff changeset
  1635
            // four point rect should be for partial pieces of text
hgs
parents:
diff changeset
  1636
hgs
parents:
diff changeset
  1637
            // need to do something for both vertical and horizontal text 0 and na slopes
hgs
parents:
diff changeset
  1638
hgs
parents:
diff changeset
  1639
            TReal32 dy = (TReal32)boundingBox.iPoint2.iY - (TReal32)boundingBox.iPoint1.iY;
hgs
parents:
diff changeset
  1640
            TReal32 dx = (TReal32)boundingBox.iPoint2.iX - (TReal32)boundingBox.iPoint1.iX;
hgs
parents:
diff changeset
  1641
hgs
parents:
diff changeset
  1642
            double aSlopeRan;
hgs
parents:
diff changeset
  1643
            Math::ATan(aSlopeRan, dy, dx);
hgs
parents:
diff changeset
  1644
hgs
parents:
diff changeset
  1645
            double aSinVal;
hgs
parents:
diff changeset
  1646
            Math::Sin(aSinVal, aSlopeRan);
hgs
parents:
diff changeset
  1647
hgs
parents:
diff changeset
  1648
            double aCosVal;
hgs
parents:
diff changeset
  1649
            Math::Cos(aCosVal, aSlopeRan);
hgs
parents:
diff changeset
  1650
hgs
parents:
diff changeset
  1651
hgs
parents:
diff changeset
  1652
            TReal32 x1 = aCosVal * leftAdvance + (TReal32)boundingBox.iPoint1.iX;
hgs
parents:
diff changeset
  1653
            TReal32 x3 = aCosVal * leftAdvance + (TReal32)boundingBox.iPoint3.iX;
hgs
parents:
diff changeset
  1654
            TReal32 y1 = aSinVal * leftAdvance + (TReal32)boundingBox.iPoint1.iY;
hgs
parents:
diff changeset
  1655
            TReal32 y3 = aSinVal * leftAdvance + (TReal32)boundingBox.iPoint3.iY;
hgs
parents:
diff changeset
  1656
hgs
parents:
diff changeset
  1657
            TReal32 x2 = aCosVal * textAdvance + x1;
hgs
parents:
diff changeset
  1658
            TReal32 x4 = aCosVal * textAdvance + x3;
hgs
parents:
diff changeset
  1659
hgs
parents:
diff changeset
  1660
            TReal32 y2 = aSinVal * textAdvance + y1;
hgs
parents:
diff changeset
  1661
            TReal32 y4 = aSinVal * textAdvance + y3;
hgs
parents:
diff changeset
  1662
hgs
parents:
diff changeset
  1663
			TSvgFourPointRect* bbox = NULL;
hgs
parents:
diff changeset
  1664
hgs
parents:
diff changeset
  1665
            TRAP_IGNORE( bbox = new (ELeave) TSvgFourPointRect( TPoint(x1, y1),
hgs
parents:
diff changeset
  1666
                        TPoint(x2, y2),
hgs
parents:
diff changeset
  1667
                        TPoint(x3, y3),
hgs
parents:
diff changeset
  1668
                        TPoint(x4, y4)) );
hgs
parents:
diff changeset
  1669
hgs
parents:
diff changeset
  1670
            if ( !bbox )
hgs
parents:
diff changeset
  1671
            {
hgs
parents:
diff changeset
  1672
            	#ifdef _DEBUG
hgs
parents:
diff changeset
  1673
            		RDebug::Printf("Four Point Rect Failed: Out of Memory");
hgs
parents:
diff changeset
  1674
            	#endif
hgs
parents:
diff changeset
  1675
            	return;
hgs
parents:
diff changeset
  1676
            }
hgs
parents:
diff changeset
  1677
hgs
parents:
diff changeset
  1678
            // store bound box pointers to go back to client
hgs
parents:
diff changeset
  1679
            aBoundingBoxes.Append( (MRect*)bbox );
hgs
parents:
diff changeset
  1680
hgs
parents:
diff changeset
  1681
            iSvgTextBoundingBoxes.Append( bbox );
hgs
parents:
diff changeset
  1682
hgs
parents:
diff changeset
  1683
            // store point to text
hgs
parents:
diff changeset
  1684
            aTexts.Append( TPtrC( textElement->GetText() ) );
hgs
parents:
diff changeset
  1685
            aElementIds.Append( (TInt)textElement );
hgs
parents:
diff changeset
  1686
hgs
parents:
diff changeset
  1687
            remainder.Set( remainder.Right( remainder.Length() - index - aSearchString.Length() ) );
hgs
parents:
diff changeset
  1688
            leftAdvance = leftAdvance + textAdvance;
hgs
parents:
diff changeset
  1689
            index = ( aCaseSensitive ) ? remainder.Find( aSearchString ) :
hgs
parents:
diff changeset
  1690
                                         remainder.FindF( aSearchString );
hgs
parents:
diff changeset
  1691
        }
hgs
parents:
diff changeset
  1692
    }
hgs
parents:
diff changeset
  1693
    CleanupStack::PopAndDestroy(searchStr);
hgs
parents:
diff changeset
  1694
    textElements.Close();
hgs
parents:
diff changeset
  1695
}
hgs
parents:
diff changeset
  1696
hgs
parents:
diff changeset
  1697
//this is the old 2point rect way that only works for horizontal text
hgs
parents:
diff changeset
  1698
/*void CSvgEngineImpl::FindBBoxesForHorizontalText( const TDesC& aSearchString,
hgs
parents:
diff changeset
  1699
                           RArray<TRect>& aBoundingBoxes,
hgs
parents:
diff changeset
  1700
                                        RArray<TPtrC>& aTexts,
hgs
parents:
diff changeset
  1701
                                        RArray<TInt>& aElementIds,
hgs
parents:
diff changeset
  1702
                                        TBool aCaseSensitive                                        )
hgs
parents:
diff changeset
  1703
{
hgs
parents:
diff changeset
  1704
    if ( iSvgDocument == NULL )
hgs
parents:
diff changeset
  1705
        return;
hgs
parents:
diff changeset
  1706
hgs
parents:
diff changeset
  1707
    // Find all text elements
hgs
parents:
diff changeset
  1708
    RPointerArray<CSvgElementImpl> textElements;
hgs
parents:
diff changeset
  1709
    iSvgDocument->FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1710
                     KSvgTextElement, textElements );
hgs
parents:
diff changeset
  1711
hgs
parents:
diff changeset
  1712
    TGfxRectangle2D boundingBox;
hgs
parents:
diff changeset
  1713
    for ( TInt i = 0; i < textElements.Count(); i++ )
hgs
parents:
diff changeset
  1714
    {
hgs
parents:
diff changeset
  1715
        CSvgTextElementImpl* textElement = (CSvgTextElementImpl*)textElements[i];
hgs
parents:
diff changeset
  1716
        TPtrC remainder( textElement->GetText() );
hgs
parents:
diff changeset
  1717
hgs
parents:
diff changeset
  1718
        TInt index = ( aCaseSensitive ) ? remainder.Find( aSearchString ) :
hgs
parents:
diff changeset
  1719
                                          remainder.FindF( aSearchString );
hgs
parents:
diff changeset
  1720
hgs
parents:
diff changeset
  1721
        // continue to next element if nothing found
hgs
parents:
diff changeset
  1722
        if ( index == KErrNotFound )
hgs
parents:
diff changeset
  1723
            continue;
hgs
parents:
diff changeset
  1724
hgs
parents:
diff changeset
  1725
        // Get the bounding box for the whole text element
hgs
parents:
diff changeset
  1726
        textElement->GetBBox( boundingBox );
hgs
parents:
diff changeset
  1727
hgs
parents:
diff changeset
  1728
        // Get bounding box for every occurrence
hgs
parents:
diff changeset
  1729
        TFloatFixPt textAdvance = textElement->TextAdvance( aSearchString, index );
hgs
parents:
diff changeset
  1730
        TFloatFixPt leftAdvance = 0.0f;
hgs
parents:
diff changeset
  1731
        while ( index != KErrNotFound )
hgs
parents:
diff changeset
  1732
        {
hgs
parents:
diff changeset
  1733
            // Calculate boundingbox for searched-text
hgs
parents:
diff changeset
  1734
            leftAdvance = leftAdvance + textElement->TextAdvance( remainder.Left( index ), index );
hgs
parents:
diff changeset
  1735
hgs
parents:
diff changeset
  1736
            TRect bbox( (TInt)boundingBox.iX + (TInt)leftAdvance,
hgs
parents:
diff changeset
  1737
                        (TInt)boundingBox.iY,
hgs
parents:
diff changeset
  1738
                        (TInt)boundingBox.iX + (TInt)leftAdvance + (TInt)textAdvance,
hgs
parents:
diff changeset
  1739
                        (TInt)boundingBox.iY + (TInt)boundingBox.iHeight );
hgs
parents:
diff changeset
  1740
hgs
parents:
diff changeset
  1741
            // store bound box
hgs
parents:
diff changeset
  1742
            aBoundingBoxes.Append( bbox );
hgs
parents:
diff changeset
  1743
hgs
parents:
diff changeset
  1744
            // store point to text
hgs
parents:
diff changeset
  1745
            aTexts.Append( TPtrC( textElement->GetText() ) );
hgs
parents:
diff changeset
  1746
            aElementIds.Append( (TInt)textElement );
hgs
parents:
diff changeset
  1747
hgs
parents:
diff changeset
  1748
            remainder.Set( remainder.Right( remainder.Length() - index - aSearchString.Length() ) );
hgs
parents:
diff changeset
  1749
            leftAdvance = leftAdvance + textAdvance;
hgs
parents:
diff changeset
  1750
            index = ( aCaseSensitive ) ? remainder.Find( aSearchString ) :
hgs
parents:
diff changeset
  1751
                                         remainder.FindF( aSearchString );
hgs
parents:
diff changeset
  1752
        }
hgs
parents:
diff changeset
  1753
    }
hgs
parents:
diff changeset
  1754
    textElements.Close();
hgs
parents:
diff changeset
  1755
}
hgs
parents:
diff changeset
  1756
*/
hgs
parents:
diff changeset
  1757
hgs
parents:
diff changeset
  1758
/************************ HyperLinking Functions ***********************/
hgs
parents:
diff changeset
  1759
hgs
parents:
diff changeset
  1760
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1761
// void CSvgEngineImpl::CheckForHyperlinkMouseover( TInt aX, TInt aY )
hgs
parents:
diff changeset
  1762
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1763
void CSvgEngineImpl::CheckForHyperlinkMouseover( TInt aX, TInt aY )
hgs
parents:
diff changeset
  1764
{
hgs
parents:
diff changeset
  1765
   if ( iHyperlinkListeners.Count() == 0 )
hgs
parents:
diff changeset
  1766
        return;
hgs
parents:
diff changeset
  1767
hgs
parents:
diff changeset
  1768
    if ( iSvgDocument == NULL )
hgs
parents:
diff changeset
  1769
        return;
hgs
parents:
diff changeset
  1770
hgs
parents:
diff changeset
  1771
    // Gather <a> elements if first time
hgs
parents:
diff changeset
  1772
    RPointerArray<CSvgElementImpl> iAElementList;
hgs
parents:
diff changeset
  1773
    if ( iAElementList.Count() == 0 )
hgs
parents:
diff changeset
  1774
        {
hgs
parents:
diff changeset
  1775
        iSvgDocument->FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1776
                         KSvgAElement, iAElementList );
hgs
parents:
diff changeset
  1777
        }
hgs
parents:
diff changeset
  1778
hgs
parents:
diff changeset
  1779
    // find the bounding box containing point
hgs
parents:
diff changeset
  1780
    TGfxPoint2D point( aX, aY );
hgs
parents:
diff changeset
  1781
    TGfxRectangle2D boundingBox;
hgs
parents:
diff changeset
  1782
    TInt aEleListCnt = iAElementList.Count();
hgs
parents:
diff changeset
  1783
    for ( TInt i = 0; i < aEleListCnt; i++ )
hgs
parents:
diff changeset
  1784
        {
hgs
parents:
diff changeset
  1785
        CSvgElementImpl* element = iAElementList[i];
hgs
parents:
diff changeset
  1786
        CSvgGElementImpl::GetGroupBounding( boundingBox, element );
hgs
parents:
diff changeset
  1787
        if ( boundingBox.Contains( point ) )
hgs
parents:
diff changeset
  1788
            {
hgs
parents:
diff changeset
  1789
            // no existing mouse over element: notify HyperlinkEntered
hgs
parents:
diff changeset
  1790
            if ( iMouseoverElement == NULL )
hgs
parents:
diff changeset
  1791
                {
hgs
parents:
diff changeset
  1792
                NotifyHyperlinkEntered( element->Href() );
hgs
parents:
diff changeset
  1793
                }
hgs
parents:
diff changeset
  1794
            // otherwise: notify HyperlinkExited, HyperlinkEntered
hgs
parents:
diff changeset
  1795
            else if ( iMouseoverElement != element )
hgs
parents:
diff changeset
  1796
                {
hgs
parents:
diff changeset
  1797
                NotifyHyperlinkExited( iMouseoverElement->Href() );
hgs
parents:
diff changeset
  1798
                NotifyHyperlinkEntered( element->Href() );
hgs
parents:
diff changeset
  1799
                }
hgs
parents:
diff changeset
  1800
            iMouseoverElement = element;
hgs
parents:
diff changeset
  1801
            return;
hgs
parents:
diff changeset
  1802
            }
hgs
parents:
diff changeset
  1803
        }
hgs
parents:
diff changeset
  1804
hgs
parents:
diff changeset
  1805
    // no bounding box containing point: notify HyperlinkExited
hgs
parents:
diff changeset
  1806
    if ( iMouseoverElement != NULL )
hgs
parents:
diff changeset
  1807
    {
hgs
parents:
diff changeset
  1808
        NotifyHyperlinkExited( iMouseoverElement->Href() );
hgs
parents:
diff changeset
  1809
        iMouseoverElement = NULL;
hgs
parents:
diff changeset
  1810
    }
hgs
parents:
diff changeset
  1811
hgs
parents:
diff changeset
  1812
    iAElementList.Close();
hgs
parents:
diff changeset
  1813
}
hgs
parents:
diff changeset
  1814
hgs
parents:
diff changeset
  1815
/*-------------------------Animation Listeners-----------------------------*/
hgs
parents:
diff changeset
  1816
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1817
// void CSvgEngineImpl::AddAnimationListener( MSvgAnimationListener* aListener )
hgs
parents:
diff changeset
  1818
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1819
void CSvgEngineImpl::AddAnimationListener( MSvgAnimationListener* aListener )
hgs
parents:
diff changeset
  1820
{
hgs
parents:
diff changeset
  1821
    if ( aListener != NULL && iAnimationListeners.Find( aListener ) == KErrNotFound )
hgs
parents:
diff changeset
  1822
        iAnimationListeners.Append( aListener );
hgs
parents:
diff changeset
  1823
hgs
parents:
diff changeset
  1824
}
hgs
parents:
diff changeset
  1825
hgs
parents:
diff changeset
  1826
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1827
// void CSvgEngineImpl::RemoveAnimationListener( MSvgAnimationListener* aListener )
hgs
parents:
diff changeset
  1828
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1829
void CSvgEngineImpl::RemoveAnimationListener( MSvgAnimationListener* aListener )
hgs
parents:
diff changeset
  1830
{
hgs
parents:
diff changeset
  1831
    TInt index = iAnimationListeners.Find( aListener );
hgs
parents:
diff changeset
  1832
    if ( index != KErrNotFound )
hgs
parents:
diff changeset
  1833
        iAnimationListeners.Remove( index );
hgs
parents:
diff changeset
  1834
}
hgs
parents:
diff changeset
  1835
hgs
parents:
diff changeset
  1836
/*-------------------------Animation listener notification to client-------*/
hgs
parents:
diff changeset
  1837
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1838
// void CSvgEngineImpl::NotifyAnimationStarted()
hgs
parents:
diff changeset
  1839
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1840
void CSvgEngineImpl::NotifyAnimationStarted()
hgs
parents:
diff changeset
  1841
{
hgs
parents:
diff changeset
  1842
hgs
parents:
diff changeset
  1843
    TBool isAnimationIndefinite = EFalse;
hgs
parents:
diff changeset
  1844
    if ( ( iSvgDocument == NULL ) || ( iSvgDocument->RootElement() == NULL ) ||
hgs
parents:
diff changeset
  1845
         ( iAnimationListeners.Count() == 0 ) )
hgs
parents:
diff changeset
  1846
    {
hgs
parents:
diff changeset
  1847
        return;
hgs
parents:
diff changeset
  1848
    }
hgs
parents:
diff changeset
  1849
hgs
parents:
diff changeset
  1850
    RPointerArray<CSvgElementImpl> AnimationElementList;
hgs
parents:
diff changeset
  1851
hgs
parents:
diff changeset
  1852
    iSvgDocument->FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1853
                                 KSvgSetElement, AnimationElementList );
hgs
parents:
diff changeset
  1854
    iSvgDocument->FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1855
                                 KSvgAnimateElement, AnimationElementList );
hgs
parents:
diff changeset
  1856
    iSvgDocument->FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1857
                                 KSvgAnimateMotionElement, AnimationElementList );
hgs
parents:
diff changeset
  1858
    iSvgDocument->FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1859
                                 KSvgAnimateTransformElement, AnimationElementList );
hgs
parents:
diff changeset
  1860
    iSvgDocument->FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1861
                                 KSvgAnimateColorElement, AnimationElementList );
hgs
parents:
diff changeset
  1862
hgs
parents:
diff changeset
  1863
    if ( AnimationElementList.Count() != 0 )
hgs
parents:
diff changeset
  1864
    {
hgs
parents:
diff changeset
  1865
    	TInt animationEleListCnt = AnimationElementList.Count();
hgs
parents:
diff changeset
  1866
        for ( TInt i=0; i < animationEleListCnt; i++ )
hgs
parents:
diff changeset
  1867
        {
hgs
parents:
diff changeset
  1868
             CSvgElementImpl * element = AnimationElementList[i];
hgs
parents:
diff changeset
  1869
              if ( ((CSvgAnimationBase *)element)->CompleteDuration() == KTimeIndefinite )  
hgs
parents:
diff changeset
  1870
                {
hgs
parents:
diff changeset
  1871
                 isAnimationIndefinite = ETrue;
hgs
parents:
diff changeset
  1872
                 break;
hgs
parents:
diff changeset
  1873
                }
hgs
parents:
diff changeset
  1874
        }
hgs
parents:
diff changeset
  1875
hgs
parents:
diff changeset
  1876
    }
hgs
parents:
diff changeset
  1877
   AnimationElementList.Close();
hgs
parents:
diff changeset
  1878
hgs
parents:
diff changeset
  1879
   TInt animationListenersCnt = iAnimationListeners.Count();
hgs
parents:
diff changeset
  1880
   for ( TInt i = 0; i < animationListenersCnt; i++ )
hgs
parents:
diff changeset
  1881
        iAnimationListeners[i]->AnimationStarted( isAnimationIndefinite );
hgs
parents:
diff changeset
  1882
hgs
parents:
diff changeset
  1883
hgs
parents:
diff changeset
  1884
}
hgs
parents:
diff changeset
  1885
hgs
parents:
diff changeset
  1886
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1887
// void CSvgEngineImpl::NotifyAnimationPaused()
hgs
parents:
diff changeset
  1888
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1889
void CSvgEngineImpl::NotifyAnimationPaused()
hgs
parents:
diff changeset
  1890
{
hgs
parents:
diff changeset
  1891
	TInt animationListenersCnt = iAnimationListeners.Count();
hgs
parents:
diff changeset
  1892
    for ( TInt i = 0; i < animationListenersCnt; i++ )
hgs
parents:
diff changeset
  1893
        iAnimationListeners[i]->AnimationPaused();
hgs
parents:
diff changeset
  1894
}
hgs
parents:
diff changeset
  1895
hgs
parents:
diff changeset
  1896
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1897
// void CSvgEngineImpl::NotifyAnimationEnded()
hgs
parents:
diff changeset
  1898
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1899
void CSvgEngineImpl::NotifyAnimationEnded()
hgs
parents:
diff changeset
  1900
{
hgs
parents:
diff changeset
  1901
    if ( ( iSvgDocument == NULL ) || ( iSvgDocument->RootElement() == NULL ) ||
hgs
parents:
diff changeset
  1902
         ( iAnimationListeners.Count() == 0 ) )
hgs
parents:
diff changeset
  1903
    {
hgs
parents:
diff changeset
  1904
        return;
hgs
parents:
diff changeset
  1905
    }
hgs
parents:
diff changeset
  1906
 #if 0
hgs
parents:
diff changeset
  1907
    RPointerArray<CSvgElementImpl> AnimationElementList;
hgs
parents:
diff changeset
  1908
hgs
parents:
diff changeset
  1909
    FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1910
                                 KSvgSetElement, AnimationElementList );
hgs
parents:
diff changeset
  1911
    FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1912
                                 KSvgAnimateElement, AnimationElementList );
hgs
parents:
diff changeset
  1913
    FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1914
                                 KSvgAnimateMotionElement, AnimationElementList );
hgs
parents:
diff changeset
  1915
    FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1916
                                 KSvgAnimateTransformElement, AnimationElementList );
hgs
parents:
diff changeset
  1917
    FindAllElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  1918
                                 KSvgAnimateColorElement, AnimationElementList );
hgs
parents:
diff changeset
  1919
hgs
parents:
diff changeset
  1920
    if ( AnimationElementList.Count() != 0 )
hgs
parents:
diff changeset
  1921
    {
hgs
parents:
diff changeset
  1922
    	TInt animationEleListCnt = AnimationElementList.Count();
hgs
parents:
diff changeset
  1923
        for ( TInt i=0; i < animationEleListCnt; i++ )
hgs
parents:
diff changeset
  1924
        {
hgs
parents:
diff changeset
  1925
        CSvgElementImpl * element = AnimationElementList[i];
hgs
parents:
diff changeset
  1926
        if ( ((CSvgAnimationBase *)element)->iAnimStatus == KAnimActive )
hgs
parents:
diff changeset
  1927
            {
hgs
parents:
diff changeset
  1928
             AnimationElementList.Close();
hgs
parents:
diff changeset
  1929
             return;
hgs
parents:
diff changeset
  1930
            }
hgs
parents:
diff changeset
  1931
        }
hgs
parents:
diff changeset
  1932
hgs
parents:
diff changeset
  1933
    }
hgs
parents:
diff changeset
  1934
     AnimationElementList.Close();
hgs
parents:
diff changeset
  1935
#endif
hgs
parents:
diff changeset
  1936
hgs
parents:
diff changeset
  1937
	TInt animationListenersCnt = iAnimationListeners.Count();
hgs
parents:
diff changeset
  1938
    for ( TInt i = 0; i < animationListenersCnt; i++ )
hgs
parents:
diff changeset
  1939
        iAnimationListeners[i]->AnimationEnded();
hgs
parents:
diff changeset
  1940
hgs
parents:
diff changeset
  1941
}
hgs
parents:
diff changeset
  1942
hgs
parents:
diff changeset
  1943
/*------------------Register Client Text Area listeners----------------------------*/
hgs
parents:
diff changeset
  1944
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1945
// void CSvgEngineImpl::AddTextAreaListener( MSvgTextAreaListener* aListener )
hgs
parents:
diff changeset
  1946
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1947
void CSvgEngineImpl::AddTextAreaListener( MSvgTextAreaListener* aListener )
hgs
parents:
diff changeset
  1948
{
hgs
parents:
diff changeset
  1949
    if ( aListener != NULL && iTextAreaListeners.Find( aListener ) == KErrNotFound )
hgs
parents:
diff changeset
  1950
    {
hgs
parents:
diff changeset
  1951
        iTextAreaListeners.Append( aListener );
hgs
parents:
diff changeset
  1952
    }
hgs
parents:
diff changeset
  1953
}
hgs
parents:
diff changeset
  1954
hgs
parents:
diff changeset
  1955
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1956
// void CSvgEngineImpl::RemoveTextAreaListener( MSvgTextAreaListener* aListener )
hgs
parents:
diff changeset
  1957
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1958
void CSvgEngineImpl::RemoveTextAreaListener( MSvgTextAreaListener* aListener )
hgs
parents:
diff changeset
  1959
{
hgs
parents:
diff changeset
  1960
    TInt index = iTextAreaListeners.Find( aListener );
hgs
parents:
diff changeset
  1961
    if ( index != KErrNotFound )
hgs
parents:
diff changeset
  1962
    {
hgs
parents:
diff changeset
  1963
        iTextAreaListeners.Remove( index );
hgs
parents:
diff changeset
  1964
    }
hgs
parents:
diff changeset
  1965
}
hgs
parents:
diff changeset
  1966
hgs
parents:
diff changeset
  1967
/*----------------Text Area listener notification to client--------------*/
hgs
parents:
diff changeset
  1968
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1969
// void CSvgEngineImpl::NotifyTextAreaEntered( CSvgTextAreaElementImpl* aTextAreaHandle )
hgs
parents:
diff changeset
  1970
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1971
void CSvgEngineImpl::NotifyTextAreaEntered( CSvgTextAreaElementImpl* aTextAreaHandle )
hgs
parents:
diff changeset
  1972
{
hgs
parents:
diff changeset
  1973
	TInt textAreaListenersCnt = iTextAreaListeners.Count();
hgs
parents:
diff changeset
  1974
    for (TInt i=0; i < textAreaListenersCnt; i++)
hgs
parents:
diff changeset
  1975
    {
hgs
parents:
diff changeset
  1976
        iTextAreaListeners[i]->TextAreaEntered( (TInt)aTextAreaHandle);
hgs
parents:
diff changeset
  1977
    }
hgs
parents:
diff changeset
  1978
}
hgs
parents:
diff changeset
  1979
hgs
parents:
diff changeset
  1980
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1981
// void CSvgEngineImpl::NotifyTextAreaExited( CSvgTextAreaElementImpl* aTextAreaHandle )
hgs
parents:
diff changeset
  1982
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1983
void CSvgEngineImpl::NotifyTextAreaExited( CSvgTextAreaElementImpl* aTextAreaHandle )
hgs
parents:
diff changeset
  1984
{
hgs
parents:
diff changeset
  1985
	TInt textAreaListenersCnt = iTextAreaListeners.Count();
hgs
parents:
diff changeset
  1986
    for (TInt i=0; i < textAreaListenersCnt; i++)
hgs
parents:
diff changeset
  1987
    {
hgs
parents:
diff changeset
  1988
        iTextAreaListeners[i]->TextAreaExited( (TInt)aTextAreaHandle);
hgs
parents:
diff changeset
  1989
    }
hgs
parents:
diff changeset
  1990
}
hgs
parents:
diff changeset
  1991
hgs
parents:
diff changeset
  1992
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  1993
// void CSvgEngineImpl::NotifyTextAreaActivated( CSvgTextAreaElementImpl* aTextAreaHandle )
hgs
parents:
diff changeset
  1994
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  1995
void CSvgEngineImpl::NotifyTextAreaActivated( CSvgTextAreaElementImpl* aTextAreaHandle )
hgs
parents:
diff changeset
  1996
{
hgs
parents:
diff changeset
  1997
	TInt textAreaListenersCnt = iTextAreaListeners.Count();
hgs
parents:
diff changeset
  1998
	for (TInt i=0; i < textAreaListenersCnt; i++)
hgs
parents:
diff changeset
  1999
    {
hgs
parents:
diff changeset
  2000
        iTextAreaListeners[i]->TextAreaActivated( (TInt)aTextAreaHandle );
hgs
parents:
diff changeset
  2001
    }
hgs
parents:
diff changeset
  2002
}
hgs
parents:
diff changeset
  2003
hgs
parents:
diff changeset
  2004
/*------------------Register Client Text listeners----------------------------*/
hgs
parents:
diff changeset
  2005
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2006
// void CSvgEngineImpl::AddTextListener( MSvgTextListener* aListener )
hgs
parents:
diff changeset
  2007
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2008
void CSvgEngineImpl::AddTextListener( MSvgTextListener* aListener )
hgs
parents:
diff changeset
  2009
{
hgs
parents:
diff changeset
  2010
    if ( aListener != NULL && iTextListeners.Find( aListener ) == KErrNotFound )
hgs
parents:
diff changeset
  2011
    {
hgs
parents:
diff changeset
  2012
        iTextListeners.Append( aListener );
hgs
parents:
diff changeset
  2013
    }
hgs
parents:
diff changeset
  2014
}
hgs
parents:
diff changeset
  2015
hgs
parents:
diff changeset
  2016
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2017
// void CSvgEngineImpl::RemoveTextListener( MSvgTextListener* aListener )
hgs
parents:
diff changeset
  2018
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2019
void CSvgEngineImpl::RemoveTextListener( MSvgTextListener* aListener )
hgs
parents:
diff changeset
  2020
{
hgs
parents:
diff changeset
  2021
    TInt index = iTextListeners.Find( aListener );
hgs
parents:
diff changeset
  2022
    if ( index != KErrNotFound )
hgs
parents:
diff changeset
  2023
    {
hgs
parents:
diff changeset
  2024
        iTextListeners.Remove( index );
hgs
parents:
diff changeset
  2025
    }
hgs
parents:
diff changeset
  2026
}
hgs
parents:
diff changeset
  2027
hgs
parents:
diff changeset
  2028
/*----------------Text listener notification to client--------------*/
hgs
parents:
diff changeset
  2029
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2030
// void CSvgEngineImpl::NotifyTextEntered( CSvgTextElementImpl* aTextHandle )
hgs
parents:
diff changeset
  2031
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2032
void CSvgEngineImpl::NotifyTextEntered( CSvgTextElementImpl* aTextHandle )
hgs
parents:
diff changeset
  2033
{
hgs
parents:
diff changeset
  2034
	TInt textListenersCnt = iTextListeners.Count();
hgs
parents:
diff changeset
  2035
    for (TInt i=0; i < textListenersCnt; i++)
hgs
parents:
diff changeset
  2036
    {
hgs
parents:
diff changeset
  2037
        iTextListeners[i]->TextEntered( (TInt)aTextHandle);
hgs
parents:
diff changeset
  2038
    }
hgs
parents:
diff changeset
  2039
}
hgs
parents:
diff changeset
  2040
hgs
parents:
diff changeset
  2041
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2042
// void CSvgEngineImpl::NotifyTextExited( CSvgTextElementImpl* aTextHandle )
hgs
parents:
diff changeset
  2043
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2044
void CSvgEngineImpl::NotifyTextExited( CSvgTextElementImpl* aTextHandle )
hgs
parents:
diff changeset
  2045
{
hgs
parents:
diff changeset
  2046
	TInt textListenersCnt = iTextListeners.Count();
hgs
parents:
diff changeset
  2047
    for (TInt i=0; i < textListenersCnt; i++)
hgs
parents:
diff changeset
  2048
    {
hgs
parents:
diff changeset
  2049
        iTextListeners[i]->TextExited( (TInt)aTextHandle);
hgs
parents:
diff changeset
  2050
    }
hgs
parents:
diff changeset
  2051
}
hgs
parents:
diff changeset
  2052
hgs
parents:
diff changeset
  2053
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2054
// void CSvgEngineImpl::NotifyTextActivated( CSvgTextElementImpl* aTextHandle )
hgs
parents:
diff changeset
  2055
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2056
void CSvgEngineImpl::NotifyTextActivated( CSvgTextElementImpl* aTextHandle )
hgs
parents:
diff changeset
  2057
{
hgs
parents:
diff changeset
  2058
	TInt textListenersCnt = iTextListeners.Count();
hgs
parents:
diff changeset
  2059
    for (TInt i=0; i < textListenersCnt; i++)
hgs
parents:
diff changeset
  2060
    {
hgs
parents:
diff changeset
  2061
        iTextListeners[i]->TextActivated( (TInt)aTextHandle );
hgs
parents:
diff changeset
  2062
    }
hgs
parents:
diff changeset
  2063
}
hgs
parents:
diff changeset
  2064
hgs
parents:
diff changeset
  2065
/*---------------------Register Client Hyperlink listeners----------------------------*/
hgs
parents:
diff changeset
  2066
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2067
// void CSvgEngineImpl::AddHyperlinkListener( MSvgHyperlinkListener* aListener )
hgs
parents:
diff changeset
  2068
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2069
void CSvgEngineImpl::AddHyperlinkListener( MSvgHyperlinkListener* aListener )
hgs
parents:
diff changeset
  2070
{
hgs
parents:
diff changeset
  2071
    if ( aListener != NULL && iHyperlinkListeners.Find( aListener ) == KErrNotFound )
hgs
parents:
diff changeset
  2072
        iHyperlinkListeners.Append( aListener );
hgs
parents:
diff changeset
  2073
}
hgs
parents:
diff changeset
  2074
hgs
parents:
diff changeset
  2075
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2076
// void CSvgEngineImpl::RemoveHyperlinkListener( MSvgHyperlinkListener* aListener )
hgs
parents:
diff changeset
  2077
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2078
void CSvgEngineImpl::RemoveHyperlinkListener( MSvgHyperlinkListener* aListener )
hgs
parents:
diff changeset
  2079
{
hgs
parents:
diff changeset
  2080
    TInt index = iHyperlinkListeners.Find( aListener );
hgs
parents:
diff changeset
  2081
    if ( index != KErrNotFound )
hgs
parents:
diff changeset
  2082
        iHyperlinkListeners.Remove( index );
hgs
parents:
diff changeset
  2083
}
hgs
parents:
diff changeset
  2084
hgs
parents:
diff changeset
  2085
void CSvgEngineImpl::AddViewPortListener(MSvgViewPortListener* aListener)
hgs
parents:
diff changeset
  2086
{
hgs
parents:
diff changeset
  2087
    if ( aListener != NULL )
hgs
parents:
diff changeset
  2088
    {
hgs
parents:
diff changeset
  2089
        iViewPortListener = aListener ;
hgs
parents:
diff changeset
  2090
    }
hgs
parents:
diff changeset
  2091
        
hgs
parents:
diff changeset
  2092
}
hgs
parents:
diff changeset
  2093
  
hgs
parents:
diff changeset
  2094
        
hgs
parents:
diff changeset
  2095
void CSvgEngineImpl::RemoveViewPortListener(MSvgViewPortListener* 
hgs
parents:
diff changeset
  2096
        /* aListener */ )
hgs
parents:
diff changeset
  2097
{
hgs
parents:
diff changeset
  2098
    if(iViewPortListener != NULL)
hgs
parents:
diff changeset
  2099
    {
hgs
parents:
diff changeset
  2100
        iViewPortListener = NULL;
hgs
parents:
diff changeset
  2101
    }
hgs
parents:
diff changeset
  2102
}
hgs
parents:
diff changeset
  2103
/*----------------Hyperlink listener notification to client--------------*/
hgs
parents:
diff changeset
  2104
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2105
// void CSvgEngineImpl::NotifyHyperlinkEntered( CSvgAElementImpl* aAElementHandle )
hgs
parents:
diff changeset
  2106
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2107
void CSvgEngineImpl::NotifyHyperlinkEntered( CSvgAElementImpl* aAElementHandle )
hgs
parents:
diff changeset
  2108
{
hgs
parents:
diff changeset
  2109
	TInt hyperLinkListenersCnt = iHyperlinkListeners.Count();
hgs
parents:
diff changeset
  2110
    for ( TInt i = 0; i < hyperLinkListenersCnt; i++ )
hgs
parents:
diff changeset
  2111
    {
hgs
parents:
diff changeset
  2112
        if (aAElementHandle)
hgs
parents:
diff changeset
  2113
        {
hgs
parents:
diff changeset
  2114
            iHyperlinkListeners[i]->LinkEntered( aAElementHandle->Href() );
hgs
parents:
diff changeset
  2115
        }
hgs
parents:
diff changeset
  2116
    }
hgs
parents:
diff changeset
  2117
}
hgs
parents:
diff changeset
  2118
hgs
parents:
diff changeset
  2119
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2120
// void CSvgEngineImpl::NotifyHyperlinkEntered( const TDesC& aUri )
hgs
parents:
diff changeset
  2121
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2122
void CSvgEngineImpl::NotifyHyperlinkEntered( const TDesC& aUri )
hgs
parents:
diff changeset
  2123
{
hgs
parents:
diff changeset
  2124
	TInt hyperLinkListenersCnt = iHyperlinkListeners.Count();
hgs
parents:
diff changeset
  2125
    for ( TInt i = 0; i < hyperLinkListenersCnt; i++ )
hgs
parents:
diff changeset
  2126
    {
hgs
parents:
diff changeset
  2127
        iHyperlinkListeners[i]->LinkEntered( aUri );
hgs
parents:
diff changeset
  2128
    }
hgs
parents:
diff changeset
  2129
}
hgs
parents:
diff changeset
  2130
hgs
parents:
diff changeset
  2131
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2132
// void CSvgEngineImpl::NotifyHyperlinkExited( CSvgAElementImpl* aAElementHandle )
hgs
parents:
diff changeset
  2133
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2134
void CSvgEngineImpl::NotifyHyperlinkExited( CSvgAElementImpl* aAElementHandle )
hgs
parents:
diff changeset
  2135
{
hgs
parents:
diff changeset
  2136
	TInt hyperLinkListenersCnt = iHyperlinkListeners.Count();
hgs
parents:
diff changeset
  2137
    for ( TInt i = 0; i < hyperLinkListenersCnt; i++ )
hgs
parents:
diff changeset
  2138
    {
hgs
parents:
diff changeset
  2139
        if (aAElementHandle)
hgs
parents:
diff changeset
  2140
        {
hgs
parents:
diff changeset
  2141
            iHyperlinkListeners[i]->LinkExited( aAElementHandle->Href() );
hgs
parents:
diff changeset
  2142
        }
hgs
parents:
diff changeset
  2143
    }
hgs
parents:
diff changeset
  2144
}
hgs
parents:
diff changeset
  2145
hgs
parents:
diff changeset
  2146
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2147
// void CSvgEngineImpl::NotifyHyperlinkExited( const TDesC& aUri )
hgs
parents:
diff changeset
  2148
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2149
void CSvgEngineImpl::NotifyHyperlinkExited( const TDesC& aUri )
hgs
parents:
diff changeset
  2150
{
hgs
parents:
diff changeset
  2151
	TInt hyperLinkListenersCnt = iHyperlinkListeners.Count();
hgs
parents:
diff changeset
  2152
    for ( TInt i = 0; i < hyperLinkListenersCnt; i++ )
hgs
parents:
diff changeset
  2153
    {
hgs
parents:
diff changeset
  2154
        iHyperlinkListeners[i]->LinkExited( aUri );
hgs
parents:
diff changeset
  2155
    }
hgs
parents:
diff changeset
  2156
}
hgs
parents:
diff changeset
  2157
hgs
parents:
diff changeset
  2158
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2159
// void CSvgEngineImpl::NotifyHyperlinkActivated( CSvgAElementImpl* aAElementHandle )
hgs
parents:
diff changeset
  2160
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2161
void CSvgEngineImpl::NotifyHyperlinkActivated( CSvgAElementImpl* aAElementHandle )
hgs
parents:
diff changeset
  2162
{
hgs
parents:
diff changeset
  2163
    if ( !aAElementHandle ||
hgs
parents:
diff changeset
  2164
          aAElementHandle->Href().Length() == 0 ||
hgs
parents:
diff changeset
  2165
          aAElementHandle->Href()[0] == '#' )
hgs
parents:
diff changeset
  2166
        {
hgs
parents:
diff changeset
  2167
        return;
hgs
parents:
diff changeset
  2168
        }
hgs
parents:
diff changeset
  2169
hgs
parents:
diff changeset
  2170
	TInt hyperLinkListenersCnt = iHyperlinkListeners.Count();
hgs
parents:
diff changeset
  2171
    for ( TInt i = 0; i < hyperLinkListenersCnt; i++ )
hgs
parents:
diff changeset
  2172
    {
hgs
parents:
diff changeset
  2173
        iHyperlinkListeners[i]->LinkActivated( aAElementHandle->Href() );
hgs
parents:
diff changeset
  2174
    }
hgs
parents:
diff changeset
  2175
}
hgs
parents:
diff changeset
  2176
hgs
parents:
diff changeset
  2177
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2178
// void CSvgEngineImpl::NotifyHyperlinkActivated( const TDesC& aUri )
hgs
parents:
diff changeset
  2179
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2180
void CSvgEngineImpl::NotifyHyperlinkActivated( const TDesC& aUri )
hgs
parents:
diff changeset
  2181
{
hgs
parents:
diff changeset
  2182
	TInt hyperLinkListenersCnt = iHyperlinkListeners.Count();
hgs
parents:
diff changeset
  2183
    for ( TInt i = 0; i < hyperLinkListenersCnt; i++ )
hgs
parents:
diff changeset
  2184
    {
hgs
parents:
diff changeset
  2185
        iHyperlinkListeners[i]->LinkActivated( aUri );
hgs
parents:
diff changeset
  2186
    }
hgs
parents:
diff changeset
  2187
}
hgs
parents:
diff changeset
  2188
hgs
parents:
diff changeset
  2189
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2190
// void CSvgEngineImpl::NotifyHyperlinkActivatedWithShow( const TDesC& aUri, const TDesC& aShow )
hgs
parents:
diff changeset
  2191
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2192
void CSvgEngineImpl::NotifyHyperlinkActivatedWithShow( const TDesC& aUri, const TDesC& aShow )
hgs
parents:
diff changeset
  2193
{
hgs
parents:
diff changeset
  2194
	TInt hyperLinkListenersCnt = iHyperlinkListeners.Count();
hgs
parents:
diff changeset
  2195
    for ( TInt i = 0; i < hyperLinkListenersCnt; i++ )
hgs
parents:
diff changeset
  2196
        iHyperlinkListeners[i]->LinkActivatedWithShow( aUri, aShow );
hgs
parents:
diff changeset
  2197
}
hgs
parents:
diff changeset
  2198
hgs
parents:
diff changeset
  2199
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2200
// void CSvgEngineImpl::NotifyElementActivatedLinkEntered( CSvgElementImpl* aElement)
hgs
parents:
diff changeset
  2201
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2202
void CSvgEngineImpl::NotifyElementActivatedLinkEntered( CSvgElementImpl* aElement)
hgs
parents:
diff changeset
  2203
    {
hgs
parents:
diff changeset
  2204
      if(iMouseoverElement  == NULL)
hgs
parents:
diff changeset
  2205
        {
hgs
parents:
diff changeset
  2206
        const TDesC* myId = aElement->Id();
hgs
parents:
diff changeset
  2207
hgs
parents:
diff changeset
  2208
        if (myId)
hgs
parents:
diff changeset
  2209
        NotifyHyperlinkEntered( *(myId));
hgs
parents:
diff changeset
  2210
        iMouseoverElement = aElement;
hgs
parents:
diff changeset
  2211
        }
hgs
parents:
diff changeset
  2212
    }
hgs
parents:
diff changeset
  2213
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2214
// void CSvgEngineImpl::NotifyElementActivatedLinkExited(  CSvgElementImpl* aElement)
hgs
parents:
diff changeset
  2215
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2216
void CSvgEngineImpl::NotifyElementActivatedLinkExited(  CSvgElementImpl* aElement)
hgs
parents:
diff changeset
  2217
    {
hgs
parents:
diff changeset
  2218
        if(iMouseoverElement == aElement )
hgs
parents:
diff changeset
  2219
        {
hgs
parents:
diff changeset
  2220
        const TDesC* myId = aElement->Id();
hgs
parents:
diff changeset
  2221
hgs
parents:
diff changeset
  2222
        if (myId)
hgs
parents:
diff changeset
  2223
        NotifyHyperlinkExited( *(myId));
hgs
parents:
diff changeset
  2224
        iMouseoverElement  = NULL;
hgs
parents:
diff changeset
  2225
        }
hgs
parents:
diff changeset
  2226
    }
hgs
parents:
diff changeset
  2227
void CSvgEngineImpl::GetViewPort(TInt getWidth, TInt getHeight, TBool isWidthInPer, TBool isHeightInPer, TInt &setWidth, TInt &setHeight)
hgs
parents:
diff changeset
  2228
{
hgs
parents:
diff changeset
  2229
    if(iViewPortListener != NULL)
hgs
parents:
diff changeset
  2230
    {
hgs
parents:
diff changeset
  2231
        iViewPortListener->GetViewPort(getWidth, getHeight, isWidthInPer, isHeightInPer, setWidth, setHeight);
hgs
parents:
diff changeset
  2232
    }
hgs
parents:
diff changeset
  2233
}
hgs
parents:
diff changeset
  2234
hgs
parents:
diff changeset
  2235
/*------------------Register Client Interactive Element listeners------------*/
hgs
parents:
diff changeset
  2236
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2237
// void CSvgEngineImpl::AddInteractiveElementListener( 
hgs
parents:
diff changeset
  2238
//                                  MSvgInteractiveElementListener* aListener )
hgs
parents:
diff changeset
  2239
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2240
void CSvgEngineImpl::AddInteractiveElementListener( 
hgs
parents:
diff changeset
  2241
                                    MSvgInteractiveElementListener* aListener )
hgs
parents:
diff changeset
  2242
    {
hgs
parents:
diff changeset
  2243
    if ( 
hgs
parents:
diff changeset
  2244
        aListener != NULL &&
hgs
parents:
diff changeset
  2245
        iInteractiveElementListeners.Find( aListener ) == KErrNotFound )
hgs
parents:
diff changeset
  2246
        {
hgs
parents:
diff changeset
  2247
        iInteractiveElementListeners.Append( aListener );
hgs
parents:
diff changeset
  2248
        }
hgs
parents:
diff changeset
  2249
    }
hgs
parents:
diff changeset
  2250
hgs
parents:
diff changeset
  2251
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2252
// void CSvgEngineImpl::RemoveInteractiveElementListener( 
hgs
parents:
diff changeset
  2253
//                                  MSvgInteractiveElementListener* aListener )
hgs
parents:
diff changeset
  2254
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2255
void CSvgEngineImpl::RemoveInteractiveElementListener( 
hgs
parents:
diff changeset
  2256
                                    MSvgInteractiveElementListener* aListener )
hgs
parents:
diff changeset
  2257
    {
hgs
parents:
diff changeset
  2258
    TInt index = iInteractiveElementListeners.Find( aListener );
hgs
parents:
diff changeset
  2259
    if ( index != KErrNotFound )
hgs
parents:
diff changeset
  2260
        {
hgs
parents:
diff changeset
  2261
        iInteractiveElementListeners.Remove( index );
hgs
parents:
diff changeset
  2262
        }
hgs
parents:
diff changeset
  2263
    }
hgs
parents:
diff changeset
  2264
hgs
parents:
diff changeset
  2265
/*-----------Interactive Element listener notification to client------------*/
hgs
parents:
diff changeset
  2266
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2267
// void CSvgEngineImpl::NotifyInteractiveElementEntered(CSvgElementImpl* aElement)
hgs
parents:
diff changeset
  2268
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2269
void CSvgEngineImpl::NotifyInteractiveElementEntered(
hgs
parents:
diff changeset
  2270
                        CSvgElementImpl* aElement)
hgs
parents:
diff changeset
  2271
    {
hgs
parents:
diff changeset
  2272
    TUint16 lsubeventmask=0; 
hgs
parents:
diff changeset
  2273
    TBool linteractivity;
hgs
parents:
diff changeset
  2274
    linteractivity=this->iSvgDocument->iEventHandler->
hgs
parents:
diff changeset
  2275
    CheckInteractivityAndGetSubEventMask(aElement,lsubeventmask);
hgs
parents:
diff changeset
  2276
    if(linteractivity)
hgs
parents:
diff changeset
  2277
        {
hgs
parents:
diff changeset
  2278
        TInt linteractiveElementListenersCnt = iInteractiveElementListeners.Count();
hgs
parents:
diff changeset
  2279
        for ( TInt i = 0; i < linteractiveElementListenersCnt; i++ )
hgs
parents:
diff changeset
  2280
            {
hgs
parents:
diff changeset
  2281
            const TDesC* myId = aElement->Id();
hgs
parents:
diff changeset
  2282
            TPtrC16 ptr;
hgs
parents:
diff changeset
  2283
            if(myId)
hgs
parents:
diff changeset
  2284
                {
hgs
parents:
diff changeset
  2285
                ptr.Set(*myId);               
hgs
parents:
diff changeset
  2286
                }
hgs
parents:
diff changeset
  2287
            else
hgs
parents:
diff changeset
  2288
                {
hgs
parents:
diff changeset
  2289
                _LIT(KEmptyString,"");
hgs
parents:
diff changeset
  2290
                ptr.Set( KEmptyString);                      
hgs
parents:
diff changeset
  2291
                }
hgs
parents:
diff changeset
  2292
            iInteractiveElementListeners[i]->InteractiveElementEntered( 
hgs
parents:
diff changeset
  2293
                                               ptr,lsubeventmask  ); 
hgs
parents:
diff changeset
  2294
            }
hgs
parents:
diff changeset
  2295
        }
hgs
parents:
diff changeset
  2296
    }
hgs
parents:
diff changeset
  2297
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2298
// void CSvgEngineImpl::NotifyInteractiveElementExited(CSvgElementImpl* aElement)
hgs
parents:
diff changeset
  2299
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2300
void CSvgEngineImpl::NotifyInteractiveElementExited(CSvgElementImpl* aElement)
hgs
parents:
diff changeset
  2301
    {
hgs
parents:
diff changeset
  2302
	TInt linteractiveElementListenersCnt = iInteractiveElementListeners.Count();
hgs
parents:
diff changeset
  2303
    for ( TInt i = 0; i < linteractiveElementListenersCnt; i++ )
hgs
parents:
diff changeset
  2304
        {
hgs
parents:
diff changeset
  2305
        const TDesC* myId = aElement->Id();
hgs
parents:
diff changeset
  2306
        TPtrC16 ptr;
hgs
parents:
diff changeset
  2307
        if(myId)
hgs
parents:
diff changeset
  2308
            {            
hgs
parents:
diff changeset
  2309
            ptr.Set(*myId);
hgs
parents:
diff changeset
  2310
            }
hgs
parents:
diff changeset
  2311
        else
hgs
parents:
diff changeset
  2312
            {
hgs
parents:
diff changeset
  2313
            _LIT(KEmptyString,"");
hgs
parents:
diff changeset
  2314
            ptr.Set(KEmptyString);
hgs
parents:
diff changeset
  2315
            }               
hgs
parents:
diff changeset
  2316
        iInteractiveElementListeners[i]->InteractiveElementExited(ptr);
hgs
parents:
diff changeset
  2317
        }
hgs
parents:
diff changeset
  2318
	}
hgs
parents:
diff changeset
  2319
hgs
parents:
diff changeset
  2320
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2321
// Set SVG Dimension to frame buffer size
hgs
parents:
diff changeset
  2322
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2323
void CSvgEngineImpl::SetSvgDimensionToFrameBufferL(TUint aWidth, TUint aHeight)
hgs
parents:
diff changeset
  2324
    {
hgs
parents:
diff changeset
  2325
     if (iSvgDocument == NULL )   return;
hgs
parents:
diff changeset
  2326
     if (iSvgDocument->RootElement() != NULL)
hgs
parents:
diff changeset
  2327
         {
hgs
parents:
diff changeset
  2328
         CSvgElementImpl* theElement = (CSvgElementImpl*)(iSvgDocument->RootElement());
hgs
parents:
diff changeset
  2329
         ((CSvgSvgElementImpl*)theElement)->iWidthInUserCoordinate = 0;
hgs
parents:
diff changeset
  2330
         ((CSvgSvgElementImpl*)theElement)->iHeightInUserCoordinate = 0;
hgs
parents:
diff changeset
  2331
         TFloatFixPt wFix( (TInt)aWidth );
hgs
parents:
diff changeset
  2332
         TFloatFixPt hFix( (TInt)aHeight );
hgs
parents:
diff changeset
  2333
         theElement->SetAttributeFloatL(KAtrWidth, wFix );
hgs
parents:
diff changeset
  2334
         theElement->SetAttributeFloatL(KAtrHeight, hFix );
hgs
parents:
diff changeset
  2335
         }
hgs
parents:
diff changeset
  2336
hgs
parents:
diff changeset
  2337
    }
hgs
parents:
diff changeset
  2338
hgs
parents:
diff changeset
  2339
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2340
// void CSvgEngineImpl::SetMediaTime(TUint32 aTimeInMilliSeconds)
hgs
parents:
diff changeset
  2341
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2342
void CSvgEngineImpl::SetMediaTime(TUint32 aTimeInMilliSeconds)
hgs
parents:
diff changeset
  2343
    {
hgs
parents:
diff changeset
  2344
    // Set Current Time in the document
hgs
parents:
diff changeset
  2345
    if(iSvgDocument != NULL)
hgs
parents:
diff changeset
  2346
        {
hgs
parents:
diff changeset
  2347
        //iSvgDocument->SetCurrentTime( aTimeInMilliSeconds );
hgs
parents:
diff changeset
  2348
        
hgs
parents:
diff changeset
  2349
        iSvgDocument->iAnimationResetNeeded = ETrue;
hgs
parents:
diff changeset
  2350
        }
hgs
parents:
diff changeset
  2351
    if(this->iSvgDocument && this->iSvgDocument->iEventHandler)
hgs
parents:
diff changeset
  2352
        {
hgs
parents:
diff changeset
  2353
        this->iSvgDocument->iEventHandler->SetCurrentTime(aTimeInMilliSeconds);
hgs
parents:
diff changeset
  2354
        }
hgs
parents:
diff changeset
  2355
   // Find all animation elements in the document    
hgs
parents:
diff changeset
  2356
    RPointerArray<CSvgElementImpl> lAnimationEleList;
hgs
parents:
diff changeset
  2357
    if(iSvgDocument)
hgs
parents:
diff changeset
  2358
	    {
hgs
parents:
diff changeset
  2359
    iSvgDocument->FindAllElements((CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  2360
               KSvgMediaAnimationElement, lAnimationEleList );
hgs
parents:
diff changeset
  2361
    TInt lAnimationEleCnt = lAnimationEleList.Count();    
hgs
parents:
diff changeset
  2362
    for ( TInt lCurAnimationEle = 0; 
hgs
parents:
diff changeset
  2363
             lCurAnimationEle < lAnimationEleCnt; lCurAnimationEle++ )
hgs
parents:
diff changeset
  2364
        {
hgs
parents:
diff changeset
  2365
        CSvgMediaAnimationElementImpl* lAnimationElement = 
hgs
parents:
diff changeset
  2366
            (CSvgMediaAnimationElementImpl* )lAnimationEleList[ lCurAnimationEle ];
hgs
parents:
diff changeset
  2367
        CSvgDocumentImpl* lChildDoc = lAnimationElement->GetChildDocument();
hgs
parents:
diff changeset
  2368
        if ( lChildDoc )
hgs
parents:
diff changeset
  2369
            {
hgs
parents:
diff changeset
  2370
            lChildDoc->iAnimationResetNeeded = ETrue;
hgs
parents:
diff changeset
  2371
            if ( lChildDoc->iEventHandler )    
hgs
parents:
diff changeset
  2372
                {
hgs
parents:
diff changeset
  2373
                lChildDoc->iEventHandler->SetCurrentTime(aTimeInMilliSeconds); 
hgs
parents:
diff changeset
  2374
                }
hgs
parents:
diff changeset
  2375
            
hgs
parents:
diff changeset
  2376
            }
hgs
parents:
diff changeset
  2377
        }
hgs
parents:
diff changeset
  2378
    lAnimationEleList.Close();     
hgs
parents:
diff changeset
  2379
	    	
hgs
parents:
diff changeset
  2380
	    }
hgs
parents:
diff changeset
  2381
    this->SetSVGEngineState(ESVGEnginePaused);
hgs
parents:
diff changeset
  2382
    this->SeekEngine(aTimeInMilliSeconds);
hgs
parents:
diff changeset
  2383
hgs
parents:
diff changeset
  2384
    }
hgs
parents:
diff changeset
  2385
hgs
parents:
diff changeset
  2386
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2387
// TBool CSvgEngineImpl::IsElementVisible( TInt aElementId )
hgs
parents:
diff changeset
  2388
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2389
TBool CSvgEngineImpl::IsElementVisible( TInt aElementId )
hgs
parents:
diff changeset
  2390
    {
hgs
parents:
diff changeset
  2391
    if ( aElementId == 0 || iFrameBuffer == NULL )
hgs
parents:
diff changeset
  2392
        {
hgs
parents:
diff changeset
  2393
        return EFalse;
hgs
parents:
diff changeset
  2394
        }
hgs
parents:
diff changeset
  2395
hgs
parents:
diff changeset
  2396
    CSvgElementImpl* element = (CSvgElementImpl*)aElementId;
hgs
parents:
diff changeset
  2397
hgs
parents:
diff changeset
  2398
    TInt32 visibleAttribute = -1;
hgs
parents:
diff changeset
  2399
hgs
parents:
diff changeset
  2400
    TRAPD(error,element->GetAttributeIntL( KCSS_ATTR_VISIBILITY, visibleAttribute ));
hgs
parents:
diff changeset
  2401
    if (error != KErrNone)
hgs
parents:
diff changeset
  2402
       {
hgs
parents:
diff changeset
  2403
       // error processing
hgs
parents:
diff changeset
  2404
       }
hgs
parents:
diff changeset
  2405
hgs
parents:
diff changeset
  2406
hgs
parents:
diff changeset
  2407
    return visibleAttribute == 0;
hgs
parents:
diff changeset
  2408
    }
hgs
parents:
diff changeset
  2409
hgs
parents:
diff changeset
  2410
// Set whether to call request observer's UpdateScreen method
hgs
parents:
diff changeset
  2411
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2412
// void CSvgEngineImpl::SetIgnoreUpdateScreen( TBool aBool )
hgs
parents:
diff changeset
  2413
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2414
void CSvgEngineImpl::SetIgnoreUpdateScreen( TBool aBool )
hgs
parents:
diff changeset
  2415
{
hgs
parents:
diff changeset
  2416
    iIgnoreUpdateScreen = aBool;
hgs
parents:
diff changeset
  2417
}
hgs
parents:
diff changeset
  2418
hgs
parents:
diff changeset
  2419
/*---------------------------MouseListener---------------------------*/
hgs
parents:
diff changeset
  2420
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2421
// void CSvgEngineImpl::AddMouseListener( const MSvgMouseListener* aListener )
hgs
parents:
diff changeset
  2422
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2423
void CSvgEngineImpl::AddMouseListener( const MSvgMouseListener* aListener )
hgs
parents:
diff changeset
  2424
    {
hgs
parents:
diff changeset
  2425
    TInt index = iSvgMouseListeners.Find( aListener );
hgs
parents:
diff changeset
  2426
    if ( aListener != NULL && index == KErrNotFound )
hgs
parents:
diff changeset
  2427
        {
hgs
parents:
diff changeset
  2428
        iSvgMouseListeners.Append( aListener );
hgs
parents:
diff changeset
  2429
        }
hgs
parents:
diff changeset
  2430
    }
hgs
parents:
diff changeset
  2431
hgs
parents:
diff changeset
  2432
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2433
// void CSvgEngineImpl::RemoveMouseListener( const MSvgMouseListener* aListener )
hgs
parents:
diff changeset
  2434
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2435
void CSvgEngineImpl::RemoveMouseListener( const MSvgMouseListener* aListener )
hgs
parents:
diff changeset
  2436
    {
hgs
parents:
diff changeset
  2437
    TInt index = iSvgMouseListeners.Find( aListener );
hgs
parents:
diff changeset
  2438
    if ( index != KErrNotFound )
hgs
parents:
diff changeset
  2439
        {
hgs
parents:
diff changeset
  2440
        iSvgMouseListeners.Remove( index );
hgs
parents:
diff changeset
  2441
        }
hgs
parents:
diff changeset
  2442
    }
hgs
parents:
diff changeset
  2443
hgs
parents:
diff changeset
  2444
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2445
// TInt CSvgEngineImpl::MouseListenerCount()
hgs
parents:
diff changeset
  2446
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2447
TInt CSvgEngineImpl::MouseListenerCount()
hgs
parents:
diff changeset
  2448
    {
hgs
parents:
diff changeset
  2449
    return iSvgMouseListeners.Count();
hgs
parents:
diff changeset
  2450
    }
hgs
parents:
diff changeset
  2451
hgs
parents:
diff changeset
  2452
/*-------------MouseListener Notifications back to client---------------------------*/
hgs
parents:
diff changeset
  2453
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2454
// void CSvgEngineImpl::NotifyMousePressed( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2455
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2456
void CSvgEngineImpl::NotifyMousePressed( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2457
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2458
    {
hgs
parents:
diff changeset
  2459
    TInt svgMouseListenersCnt = iSvgMouseListeners.Count();
hgs
parents:
diff changeset
  2460
    for ( TInt i = 0; i < svgMouseListenersCnt; i++ )
hgs
parents:
diff changeset
  2461
        {
hgs
parents:
diff changeset
  2462
        iSvgMouseListeners[i]->MousePressed( aElements, aX, aY );
hgs
parents:
diff changeset
  2463
        }
hgs
parents:
diff changeset
  2464
    }
hgs
parents:
diff changeset
  2465
hgs
parents:
diff changeset
  2466
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2467
// void CSvgEngineImpl::NotifyMouseReleased( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2468
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2469
void CSvgEngineImpl::NotifyMouseReleased( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2470
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2471
    {
hgs
parents:
diff changeset
  2472
    TInt svgMouseListenersCnt = iSvgMouseListeners.Count();
hgs
parents:
diff changeset
  2473
    for ( TInt i = 0; i < svgMouseListenersCnt; i++ )
hgs
parents:
diff changeset
  2474
        {
hgs
parents:
diff changeset
  2475
        iSvgMouseListeners[i]->MouseReleased( aElements, aX, aY );
hgs
parents:
diff changeset
  2476
        }
hgs
parents:
diff changeset
  2477
    }
hgs
parents:
diff changeset
  2478
hgs
parents:
diff changeset
  2479
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2480
// void CSvgEngineImpl::NotifyMouseEntered( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2481
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2482
void CSvgEngineImpl::NotifyMouseEntered( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2483
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2484
    {
hgs
parents:
diff changeset
  2485
    TInt svgMouseListenersCnt = iSvgMouseListeners.Count();
hgs
parents:
diff changeset
  2486
    for ( TInt i = 0; i < svgMouseListenersCnt; i++ )
hgs
parents:
diff changeset
  2487
        {
hgs
parents:
diff changeset
  2488
        iSvgMouseListeners[i]->MouseEntered( aElements, aX, aY );
hgs
parents:
diff changeset
  2489
        }
hgs
parents:
diff changeset
  2490
    }
hgs
parents:
diff changeset
  2491
hgs
parents:
diff changeset
  2492
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2493
// void CSvgEngineImpl::NotifyMouseExited( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2494
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2495
void CSvgEngineImpl::NotifyMouseExited( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2496
                                          TInt aX, TInt aY )
hgs
parents:
diff changeset
  2497
    {
hgs
parents:
diff changeset
  2498
    TInt svgMouseListenersCnt = iSvgMouseListeners.Count();
hgs
parents:
diff changeset
  2499
    for ( TInt i = 0; i < svgMouseListenersCnt; i++ )
hgs
parents:
diff changeset
  2500
        {
hgs
parents:
diff changeset
  2501
        iSvgMouseListeners[i]->MouseExited( aElements, aX, aY );
hgs
parents:
diff changeset
  2502
        }
hgs
parents:
diff changeset
  2503
    }
hgs
parents:
diff changeset
  2504
hgs
parents:
diff changeset
  2505
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2506
// void CSvgEngineImpl::NotifyMouseMoved( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2507
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2508
void CSvgEngineImpl::NotifyMouseMoved( RPointerArray<CSvgElementImpl>& aElements,
hgs
parents:
diff changeset
  2509
                                       TInt aX, TInt aY )
hgs
parents:
diff changeset
  2510
    {
hgs
parents:
diff changeset
  2511
    TInt svgMouseListenersCnt = iSvgMouseListeners.Count();
hgs
parents:
diff changeset
  2512
    for ( TInt i = 0; i < svgMouseListenersCnt; i++ )
hgs
parents:
diff changeset
  2513
        {
hgs
parents:
diff changeset
  2514
        iSvgMouseListeners[i]->MouseMoved( aElements, aX, aY );
hgs
parents:
diff changeset
  2515
        }
hgs
parents:
diff changeset
  2516
    }
hgs
parents:
diff changeset
  2517
hgs
parents:
diff changeset
  2518
/*---------------------------------------------------------------------*/
hgs
parents:
diff changeset
  2519
hgs
parents:
diff changeset
  2520
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2521
// void CSvgEngineImpl::GetViewableElementsAtPoint( RPointerArray<CSvgElementImpl>& aElements, TInt aX, TInt aY )
hgs
parents:
diff changeset
  2522
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2523
void CSvgEngineImpl::GetViewableElementsAtPoint( CSvgDocumentImpl* aSvgDocument, RPointerArray<CSvgElementImpl>& aElements, TInt aX, TInt aY )
hgs
parents:
diff changeset
  2524
    {
hgs
parents:
diff changeset
  2525
   if ( aSvgDocument == NULL )
hgs
parents:
diff changeset
  2526
        return;
hgs
parents:
diff changeset
  2527
hgs
parents:
diff changeset
  2528
	//JSR226 Change this could slow down event handling but it seems to be required to work
hgs
parents:
diff changeset
  2529
   UpdateCTM(aSvgDocument);
hgs
parents:
diff changeset
  2530
hgs
parents:
diff changeset
  2531
    // Gather all "viewable" elements
hgs
parents:
diff changeset
  2532
    RPointerArray<CSvgElementImpl> iViewableElementList;
hgs
parents:
diff changeset
  2533
    if ( iViewableElementList.Count() == 0 )
hgs
parents:
diff changeset
  2534
        {
hgs
parents:
diff changeset
  2535
        FindAllViewableElements( (CSvgElementImpl* )aSvgDocument->RootElement(),
hgs
parents:
diff changeset
  2536
                                 iViewableElementList );
hgs
parents:
diff changeset
  2537
        }
hgs
parents:
diff changeset
  2538
hgs
parents:
diff changeset
  2539
    // find the bounding box containing point
hgs
parents:
diff changeset
  2540
    TGfxPoint2D point( aX, aY );
hgs
parents:
diff changeset
  2541
    TGfxRectangle2D boundingBox;
hgs
parents:
diff changeset
  2542
    TInt viewableEleListCnt =  iViewableElementList.Count();
hgs
parents:
diff changeset
  2543
    for ( TInt i = 0; i < viewableEleListCnt; i++ )
hgs
parents:
diff changeset
  2544
        {
hgs
parents:
diff changeset
  2545
        CSvgElementImpl* element = iViewableElementList[i];
hgs
parents:
diff changeset
  2546
        element->GetBBox( boundingBox );
hgs
parents:
diff changeset
  2547
        if ( boundingBox.Contains( point ) )
hgs
parents:
diff changeset
  2548
            {
hgs
parents:
diff changeset
  2549
            aElements.Append( element );
hgs
parents:
diff changeset
  2550
            }
hgs
parents:
diff changeset
  2551
        }
hgs
parents:
diff changeset
  2552
    // Display of list
hgs
parents:
diff changeset
  2553
    iViewableElementList.Close();
hgs
parents:
diff changeset
  2554
    }
hgs
parents:
diff changeset
  2555
hgs
parents:
diff changeset
  2556
// Return all viewable elements
hgs
parents:
diff changeset
  2557
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2558
// void CSvgEngineImpl::FindAllViewableElements( CSvgElementImpl* aStartElement,
hgs
parents:
diff changeset
  2559
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2560
void CSvgEngineImpl::FindAllViewableElements( CSvgElementImpl* aStartElement,
hgs
parents:
diff changeset
  2561
                                              RPointerArray<CSvgElementImpl>& iElementList )
hgs
parents:
diff changeset
  2562
    {
hgs
parents:
diff changeset
  2563
    if ( aStartElement == NULL )
hgs
parents:
diff changeset
  2564
        return;
hgs
parents:
diff changeset
  2565
    // The child elements of the defs element should not be viewable. skip the
hgs
parents:
diff changeset
  2566
    // tree traversing if the element id is defs element
hgs
parents:
diff changeset
  2567
    if(aStartElement->ElemID() == KSvgDefsElement)
hgs
parents:
diff changeset
  2568
        return;
hgs
parents:
diff changeset
  2569
hgs
parents:
diff changeset
  2570
    CSvgElementImpl* child = (CSvgElementImpl*)aStartElement->FirstChild();
hgs
parents:
diff changeset
  2571
    while ( child != NULL )
hgs
parents:
diff changeset
  2572
        {
hgs
parents:
diff changeset
  2573
        // add to list if child is found
hgs
parents:
diff changeset
  2574
        TInt32 displayValue = 0;
hgs
parents:
diff changeset
  2575
        TRAP_IGNORE(child->GetAttributeIntL( KCSS_ATTR_DISPLAY, displayValue ));
hgs
parents:
diff changeset
  2576
        if ( child->IsViewable() && child->IsVisible() && displayValue != KDisplayEnumNone )
hgs
parents:
diff changeset
  2577
            {
hgs
parents:
diff changeset
  2578
				//JSR226 CHANGE do we care if multiple signals are sent to some elements - would be faster without this check
hgs
parents:
diff changeset
  2579
            	if ( iElementList.Find( child ) == KErrNotFound )
hgs
parents:
diff changeset
  2580
            	{
hgs
parents:
diff changeset
  2581
            		iElementList.Append( child );
hgs
parents:
diff changeset
  2582
				}
hgs
parents:
diff changeset
  2583
			}
hgs
parents:
diff changeset
  2584
        // find in grandchildren
hgs
parents:
diff changeset
  2585
        FindAllViewableElements( child, iElementList );
hgs
parents:
diff changeset
  2586
        child = (CSvgElementImpl*)child->NextSibling();
hgs
parents:
diff changeset
  2587
        }
hgs
parents:
diff changeset
  2588
    }
hgs
parents:
diff changeset
  2589
hgs
parents:
diff changeset
  2590
// Return all non-viewable elements
hgs
parents:
diff changeset
  2591
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2592
// void CSvgEngineImpl::FindAllNonViewableElements( CSvgElementImpl* aStartElement,
hgs
parents:
diff changeset
  2593
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2594
void CSvgEngineImpl::FindAllNonViewableElements( CSvgElementImpl* aStartElement,
hgs
parents:
diff changeset
  2595
                                                 RPointerArray<CSvgElementImpl>& iElementList )
hgs
parents:
diff changeset
  2596
    {
hgs
parents:
diff changeset
  2597
    if ( aStartElement == NULL )
hgs
parents:
diff changeset
  2598
        return;
hgs
parents:
diff changeset
  2599
hgs
parents:
diff changeset
  2600
    CSvgElementImpl* child = (CSvgElementImpl*)aStartElement->FirstChild();
hgs
parents:
diff changeset
  2601
    while ( child != NULL )
hgs
parents:
diff changeset
  2602
        {
hgs
parents:
diff changeset
  2603
        // add to list if child is found
hgs
parents:
diff changeset
  2604
        if ( !child->IsViewable() && !child->IsVisible() )
hgs
parents:
diff changeset
  2605
            iElementList.Append( child );
hgs
parents:
diff changeset
  2606
hgs
parents:
diff changeset
  2607
        // find in grandchildren
hgs
parents:
diff changeset
  2608
        FindAllNonViewableElements( child, iElementList );
hgs
parents:
diff changeset
  2609
        child = (CSvgElementImpl*)child->NextSibling();
hgs
parents:
diff changeset
  2610
        }
hgs
parents:
diff changeset
  2611
    }
hgs
parents:
diff changeset
  2612
hgs
parents:
diff changeset
  2613
/**
hgs
parents:
diff changeset
  2614
 * Return the data pointed to by the given URI string,
hgs
parents:
diff changeset
  2615
 * from an external source.
hgs
parents:
diff changeset
  2616
 */
hgs
parents:
diff changeset
  2617
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2618
// HBufC8* CSvgEngineImpl::FetchExternalDataL( const TDesC& aUri )
hgs
parents:
diff changeset
  2619
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2620
HBufC8* CSvgEngineImpl::FetchExternalDataL( const TDesC& aUri )
hgs
parents:
diff changeset
  2621
    {
hgs
parents:
diff changeset
  2622
    if ( iRequestObserver == NULL )
hgs
parents:
diff changeset
  2623
        {
hgs
parents:
diff changeset
  2624
        #ifdef _DEBUG
hgs
parents:
diff changeset
  2625
        RDebug::Printf("CSvgEngineImpl::FetchExternalData--requestobserver is NULL\n");
hgs
parents:
diff changeset
  2626
        #endif //_DEBUG
hgs
parents:
diff changeset
  2627
        return NULL;
hgs
parents:
diff changeset
  2628
        }
hgs
parents:
diff changeset
  2629
    // Connect session
hgs
parents:
diff changeset
  2630
    RFs session;
hgs
parents:
diff changeset
  2631
    TInt connectError = session.Connect();
hgs
parents:
diff changeset
  2632
    if ( connectError != KErrNone )
hgs
parents:
diff changeset
  2633
        {
hgs
parents:
diff changeset
  2634
        #ifdef _DEBUG
hgs
parents:
diff changeset
  2635
        RDebug::Printf("CSvgEngineImpl::FetchExternalData--session.Connect() failed: %d\n", connectError );
hgs
parents:
diff changeset
  2636
        #endif //_DEBUG
hgs
parents:
diff changeset
  2637
        return NULL;
hgs
parents:
diff changeset
  2638
        }
hgs
parents:
diff changeset
  2639
hgs
parents:
diff changeset
  2640
    RFile fileHandle;
hgs
parents:
diff changeset
  2641
    // Check for FetchImage error code
hgs
parents:
diff changeset
  2642
    TInt fetchError = iRequestObserver->FetchImage( aUri, session, fileHandle );
hgs
parents:
diff changeset
  2643
    if ( fetchError != KErrNone )
hgs
parents:
diff changeset
  2644
        {
hgs
parents:
diff changeset
  2645
        #ifdef _DEBUG
hgs
parents:
diff changeset
  2646
        RDebug::Printf("CSvgEngineImpl::FetchExternalData--FetchImage error: %d\n", fetchError );
hgs
parents:
diff changeset
  2647
        #endif //_DEBUG
hgs
parents:
diff changeset
  2648
        session.Close();
hgs
parents:
diff changeset
  2649
        return NULL;
hgs
parents:
diff changeset
  2650
        }
hgs
parents:
diff changeset
  2651
hgs
parents:
diff changeset
  2652
    // Read file size
hgs
parents:
diff changeset
  2653
    TInt fileSize = 0;
hgs
parents:
diff changeset
  2654
    TInt sizeError = fileHandle.Size( fileSize );
hgs
parents:
diff changeset
  2655
    if ( sizeError != KErrNone )
hgs
parents:
diff changeset
  2656
        {
hgs
parents:
diff changeset
  2657
        #ifdef _DEBUG
hgs
parents:
diff changeset
  2658
        RDebug::Printf("CSvgEngineImpl::FetchExternalData--fileHandle.Size error: %d\n", sizeError );
hgs
parents:
diff changeset
  2659
        #endif //_DEBUG
hgs
parents:
diff changeset
  2660
        session.Close();
hgs
parents:
diff changeset
  2661
        return NULL;
hgs
parents:
diff changeset
  2662
        }
hgs
parents:
diff changeset
  2663
hgs
parents:
diff changeset
  2664
    // Allocate memory for file
hgs
parents:
diff changeset
  2665
    HBufC8* data = HBufC8::NewL( fileSize );
hgs
parents:
diff changeset
  2666
    TPtr8 des = data->Des();
hgs
parents:
diff changeset
  2667
    TInt readError = fileHandle.Read( des );
hgs
parents:
diff changeset
  2668
    if ( readError != KErrNone )
hgs
parents:
diff changeset
  2669
        {
hgs
parents:
diff changeset
  2670
        #ifdef _DEBUG
hgs
parents:
diff changeset
  2671
        RDebug::Printf("CSvgEngineImpl::FetchExternalData--fileHandle.Read error: %d\n", readError );
hgs
parents:
diff changeset
  2672
        #endif //_DEBUG
hgs
parents:
diff changeset
  2673
        session.Close();
hgs
parents:
diff changeset
  2674
        delete data;
hgs
parents:
diff changeset
  2675
        return NULL;
hgs
parents:
diff changeset
  2676
        }
hgs
parents:
diff changeset
  2677
hgs
parents:
diff changeset
  2678
    // Successful
hgs
parents:
diff changeset
  2679
    session.Close();
hgs
parents:
diff changeset
  2680
    return data;
hgs
parents:
diff changeset
  2681
    }
hgs
parents:
diff changeset
  2682
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2683
// void CSvgEngineImpl::SetAudioVolume( TInt aPercentage );
hgs
parents:
diff changeset
  2684
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2685
void CSvgEngineImpl::SetAudioVolume( TInt aPercentage )
hgs
parents:
diff changeset
  2686
    {
hgs
parents:
diff changeset
  2687
    
hgs
parents:
diff changeset
  2688
    if ( !iSvgDocument )
hgs
parents:
diff changeset
  2689
        {
hgs
parents:
diff changeset
  2690
        return;
hgs
parents:
diff changeset
  2691
        }
hgs
parents:
diff changeset
  2692
    // Locate all the active audio elements
hgs
parents:
diff changeset
  2693
    RPointerArray<CSvgElementImpl> lAudioElementList;
hgs
parents:
diff changeset
  2694
    
hgs
parents:
diff changeset
  2695
    iSvgDocument->FindAllElements( 
hgs
parents:
diff changeset
  2696
            (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  2697
            KSvgAudioElement, lAudioElementList );
hgs
parents:
diff changeset
  2698
    // Set the volume on each audio element
hgs
parents:
diff changeset
  2699
    TInt lAudEleCnt = lAudioElementList.Count();
hgs
parents:
diff changeset
  2700
    for ( TInt lCurAudioEle = 0; lCurAudioEle < lAudEleCnt; lCurAudioEle++ )
hgs
parents:
diff changeset
  2701
        {
hgs
parents:
diff changeset
  2702
        CSvgAudioElementImpl* lAudioElement = (CSvgAudioElementImpl*)lAudioElementList[ lCurAudioEle ];
hgs
parents:
diff changeset
  2703
        lAudioElement->SetVolume( aPercentage );
hgs
parents:
diff changeset
  2704
        }
hgs
parents:
diff changeset
  2705
    lAudioElementList.Close();
hgs
parents:
diff changeset
  2706
    }
hgs
parents:
diff changeset
  2707
hgs
parents:
diff changeset
  2708
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2709
// TBool CSvgEngineImpl::ReadyToRender()
hgs
parents:
diff changeset
  2710
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2711
TBool CSvgEngineImpl::ReadyToRender()
hgs
parents:
diff changeset
  2712
    {
hgs
parents:
diff changeset
  2713
    return iSvgDocument != NULL;
hgs
parents:
diff changeset
  2714
    }
hgs
parents:
diff changeset
  2715
hgs
parents:
diff changeset
  2716
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2717
// TBool CSvgEngineImpl::IsEndedWithCompleteTextTag( TDes &BufferPtr,
hgs
parents:
diff changeset
  2718
//                                                   TInt EndOffset)
hgs
parents:
diff changeset
  2719
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2720
TBool CSvgEngineImpl::IsEndedWithCompleteTextTag(TDes &aBufferPtr,TInt aEndOffset)
hgs
parents:
diff changeset
  2721
    {
hgs
parents:
diff changeset
  2722
    TChar KOpeningBrace = '<';
hgs
parents:
diff changeset
  2723
    TChar KSlash = '/';
hgs
parents:
diff changeset
  2724
hgs
parents:
diff changeset
  2725
    // This function searches the buffer in reverse order from the end offset
hgs
parents:
diff changeset
  2726
    // to check whether the last element had a complete text tag.
hgs
parents:
diff changeset
  2727
    // eg. of complete text tags
hgs
parents:
diff changeset
  2728
    //          <text>Hello</text>
hgs
parents:
diff changeset
  2729
    //          <text></text>
hgs
parents:
diff changeset
  2730
    // eg. of an incomplete text tag
hgs
parents:
diff changeset
  2731
    //          <text />
hgs
parents:
diff changeset
  2732
hgs
parents:
diff changeset
  2733
    TPtrC currentSelectionPtr = aBufferPtr.Left( aEndOffset );
hgs
parents:
diff changeset
  2734
    TInt OpeningBracePos = currentSelectionPtr.LocateReverse( KOpeningBrace );
hgs
parents:
diff changeset
  2735
    TInt SlashPos = currentSelectionPtr.LocateReverse( KSlash );
hgs
parents:
diff changeset
  2736
    TBool retVal = EFalse;
hgs
parents:
diff changeset
  2737
hgs
parents:
diff changeset
  2738
    // In case of a complete text tag the opening brace is one position behind
hgs
parents:
diff changeset
  2739
    // slash.
hgs
parents:
diff changeset
  2740
    if ( SlashPos == ( OpeningBracePos + 1 ) )
hgs
parents:
diff changeset
  2741
        {
hgs
parents:
diff changeset
  2742
        retVal = ETrue;
hgs
parents:
diff changeset
  2743
        }
hgs
parents:
diff changeset
  2744
hgs
parents:
diff changeset
  2745
    return retVal;
hgs
parents:
diff changeset
  2746
    }
hgs
parents:
diff changeset
  2747
hgs
parents:
diff changeset
  2748
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  2749
// void CSvgEngineImpl::SaveSvgL( const TDesC& aFileName )
hgs
parents:
diff changeset
  2750
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  2751
void CSvgEngineImpl::SaveSvgL( const TDesC& aFileName )
hgs
parents:
diff changeset
  2752
    {
hgs
parents:
diff changeset
  2753
    RFs  lFs;
hgs
parents:
diff changeset
  2754
    RFileWriteStream  lStream;
hgs
parents:
diff changeset
  2755
    TInt error ;
hgs
parents:
diff changeset
  2756
    TChar KOpeningBrace = '<';
hgs
parents:
diff changeset
  2757
    TChar KSlash = '/';
hgs
parents:
diff changeset
  2758
    // Connect to File Server to write the changed content to a file
hgs
parents:
diff changeset
  2759
    CleanupClosePushL(lFs);
hgs
parents:
diff changeset
  2760
    User::LeaveIfError(lFs.Connect() );
hgs
parents:
diff changeset
  2761
hgs
parents:
diff changeset
  2762
    TBool isOpened = EFalse;
hgs
parents:
diff changeset
  2763
    error = lFs.IsFileOpen( aFileName, isOpened ) ;
hgs
parents:
diff changeset
  2764
    // dont leave if file doesnt exist or there is no error
hgs
parents:
diff changeset
  2765
    if(error!= KErrNone && error!=KErrNotFound)
hgs
parents:
diff changeset
  2766
        {
hgs
parents:
diff changeset
  2767
        //usually will come here with KErrNotFound
hgs
parents:
diff changeset
  2768
        //since file wont exist
hgs
parents:
diff changeset
  2769
        User::Leave(error);
hgs
parents:
diff changeset
  2770
        }
hgs
parents:
diff changeset
  2771
hgs
parents:
diff changeset
  2772
    if ( isOpened )
hgs
parents:
diff changeset
  2773
        {
hgs
parents:
diff changeset
  2774
        #ifdef _DEBUG
hgs
parents:
diff changeset
  2775
        RDebug::Printf( "Cannot SaveSvgL: File is still opened: ");
hgs
parents:
diff changeset
  2776
        RDebug::RawPrint( aFileName );
hgs
parents:
diff changeset
  2777
        #endif
hgs
parents:
diff changeset
  2778
        CleanupStack::PopAndDestroy(1);
hgs
parents:
diff changeset
  2779
        return;
hgs
parents:
diff changeset
  2780
        }
hgs
parents:
diff changeset
  2781
hgs
parents:
diff changeset
  2782
    // Try to create the write stream using the file name
hgs
parents:
diff changeset
  2783
    if ( lStream.Create( lFs, aFileName, EFileWrite ) != KErrNone )
hgs
parents:
diff changeset
  2784
        {
hgs
parents:
diff changeset
  2785
        // If creation fails, file exists already, try to open the
hgs
parents:
diff changeset
  2786
        // existing file
hgs
parents:
diff changeset
  2787
        User::LeaveIfError( lStream.Open(lFs, aFileName, EFileWrite) );
hgs
parents:
diff changeset
  2788
        }
hgs
parents:
diff changeset
  2789
    CleanupClosePushL(lStream);
hgs
parents:
diff changeset
  2790
hgs
parents:
diff changeset
  2791
    // Array to store list of all editable elements
hgs
parents:
diff changeset
  2792
    RPointerArray<CSvgElementImpl> lTextElementList;
hgs
parents:
diff changeset
  2793
hgs
parents:
diff changeset
  2794
    FindEditableElements( (CSvgElementImpl* )iSvgDocument->RootElement(),
hgs
parents:
diff changeset
  2795
                          lTextElementList );
hgs
parents:
diff changeset
  2796
    CleanupClosePushL(lTextElementList);
hgs
parents:
diff changeset
  2797
    TInt index=0, startoffset = 0, endoffset = 0;
hgs
parents:
diff changeset
  2798
hgs
parents:
diff changeset
  2799
    // The content of the file is stored in the root <svg> node
hgs
parents:
diff changeset
  2800
    HBufC*  lBufferContent = ((CSvgSvgElementImpl* )iSvgDocument->RootElement())->iContent;
hgs
parents:
diff changeset
  2801
hgs
parents:
diff changeset
  2802
hgs
parents:
diff changeset
  2803
hgs
parents:
diff changeset
  2804
    // While there are remaining editable elements do
hgs
parents:
diff changeset
  2805
    while(index < lTextElementList.Count())
hgs
parents:
diff changeset
  2806
        {
hgs
parents:
diff changeset
  2807
        TBool EndedWithCompleteTextTag= true;
hgs
parents:
diff changeset
  2808
        TInt OrgLength;
hgs
parents:
diff changeset
  2809
hgs
parents:
diff changeset
  2810
        if ( lTextElementList[index]->ElemID() == KSvgTextElement )
hgs
parents:
diff changeset
  2811
            {
hgs
parents:
diff changeset
  2812
            // If the element is a <text> element invoke element specific function
hgs
parents:
diff changeset
  2813
            // to retrieve the offset and original length
hgs
parents:
diff changeset
  2814
            endoffset = ((CSvgTextElementImpl *)lTextElementList[index])->iOffset;
hgs
parents:
diff changeset
  2815
            OrgLength = ((CSvgTextElementImpl *)lTextElementList[index])->GetOrgLength();
hgs
parents:
diff changeset
  2816
            }
hgs
parents:
diff changeset
  2817
        else
hgs
parents:
diff changeset
  2818
            {
hgs
parents:
diff changeset
  2819
            // If the element is a <textArea> element invoke element specific function
hgs
parents:
diff changeset
  2820
            // to retrieve the offset and original length
hgs
parents:
diff changeset
  2821
            endoffset = ((CSvgTextAreaElementImpl *)lTextElementList[index])->iOffset;
hgs
parents:
diff changeset
  2822
            OrgLength = ((CSvgTextAreaElementImpl *)lTextElementList[index])->GetOrgLength();
hgs
parents:
diff changeset
  2823
            }
hgs
parents:
diff changeset
  2824
hgs
parents:
diff changeset
  2825
        // These are the cases which have to be processed
hgs
parents:
diff changeset
  2826
        //     a. Text Element: No Closing Tag: <text  ... />
hgs
parents:
diff changeset
  2827
        //     b. Text Element: No CData : <text ...></text>
hgs
parents:
diff changeset
  2828
        //     c. Text Element: CData : <text ...>Sample Text</text>
hgs
parents:
diff changeset
  2829
        //     d. TextArea Element: No Closing Tag: <textArea ... />
hgs
parents:
diff changeset
  2830
        //     e. TextArea Element: No CData: <textArea ...></textArea>
hgs
parents:
diff changeset
  2831
        //     f. TextArea Element: CData: <textArea ...>Sample TextArea</textArea>
hgs
parents:
diff changeset
  2832
        //     -> for a,b,d,e the endoffset represents the offset after the closing braces.
hgs
parents:
diff changeset
  2833
        //        for e.g.  <text ... />
hgs
parents:
diff changeset
  2834
        //                              ^
hgs
parents:
diff changeset
  2835
        //        <text></text>
hgs
parents:
diff changeset
  2836
        //                     ^
hgs
parents:
diff changeset
  2837
        //     -> for c,f the EndOffset represents the offset to the first character in
hgs
parents:
diff changeset
  2838
        //        content.
hgs
parents:
diff changeset
  2839
        //        <text>Hello</text>
hgs
parents:
diff changeset
  2840
        //
hgs
parents:
diff changeset
  2841
        //              ^
hgs
parents:
diff changeset
  2842
        if(!OrgLength)
hgs
parents:
diff changeset
  2843
            {
hgs
parents:
diff changeset
  2844
            //case a,b,d,e
hgs
parents:
diff changeset
  2845
            TPtr BufferPtr=lBufferContent->Des();
hgs
parents:
diff changeset
  2846
            EndedWithCompleteTextTag = IsEndedWithCompleteTextTag(BufferPtr,endoffset);
hgs
parents:
diff changeset
  2847
            if ( EndedWithCompleteTextTag )
hgs
parents:
diff changeset
  2848
                {
hgs
parents:
diff changeset
  2849
                // case b,e
hgs
parents:
diff changeset
  2850
                if(endoffset < startoffset)
hgs
parents:
diff changeset
  2851
                    {
hgs
parents:
diff changeset
  2852
                    User::Leave(KErrNotFound);
hgs
parents:
diff changeset
  2853
                    }
hgs
parents:
diff changeset
  2854
                TPtrC lPtrtoPresentText = lBufferContent->Mid( startoffset, ( endoffset - startoffset ) );
hgs
parents:
diff changeset
  2855
                //end offset modified ot point to <text></text>
hgs
parents:
diff changeset
  2856
                //                                      ^
hgs
parents:
diff changeset
  2857
                endoffset = startoffset + lPtrtoPresentText.LocateReverse( KOpeningBrace );
hgs
parents:
diff changeset
  2858
                }
hgs
parents:
diff changeset
  2859
            else
hgs
parents:
diff changeset
  2860
                {
hgs
parents:
diff changeset
  2861
                //case a,d
hgs
parents:
diff changeset
  2862
                if(endoffset < startoffset)
hgs
parents:
diff changeset
  2863
                    {
hgs
parents:
diff changeset
  2864
                    User::Leave(KErrNotFound);
hgs
parents:
diff changeset
  2865
                    }
hgs
parents:
diff changeset
  2866
                TPtrC lPtrtoPresentText = lBufferContent->Mid( startoffset, ( endoffset - startoffset ) );
hgs
parents:
diff changeset
  2867
                 endoffset = startoffset + lPtrtoPresentText.LocateReverse( KSlash );
hgs
parents:
diff changeset
  2868
                //end offset modified ot point to <text/>
hgs
parents:
diff changeset
  2869
                //                                     ^
hgs
parents:
diff changeset
  2870
                }
hgs
parents:
diff changeset
  2871
            }
hgs
parents:
diff changeset
  2872
        if(endoffset < startoffset)
hgs
parents:
diff changeset
  2873
            {
hgs
parents:
diff changeset
  2874
            User::Leave(KErrNotFound);
hgs
parents:
diff changeset
  2875
            }
hgs
parents:
diff changeset
  2876
        TPtrC lPtrtoWrBuffer = lBufferContent->Mid( startoffset, ( endoffset - startoffset ) );
hgs
parents:
diff changeset
  2877
        TInt lWrBufLength = lPtrtoWrBuffer .Length();
hgs
parents:
diff changeset
  2878
        User::LeaveIfError(WriteToStream(lStream,lPtrtoWrBuffer));
hgs
parents:
diff changeset
  2879
        // If it was a text element ...
hgs
parents:
diff changeset
  2880
        if ( lTextElementList[index]->ElemID() == KSvgTextElement )
hgs
parents:
diff changeset
  2881
            {
hgs
parents:
diff changeset
  2882
            HBufC *lBufTextContent= NULL;
hgs
parents:
diff changeset
  2883
            //make startoffset point to opening tag '<' or '/' in case of a,d
hgs
parents:
diff changeset
  2884
            TPtrC lPtrtoTextContent= ( (CSvgTextElementImpl* ) lTextElementList[ index ] )->GetText();
hgs
parents:
diff changeset
  2885
            startoffset = endoffset + ( (CSvgTextElementImpl* ) lTextElementList[ index ] )->iOrgLength;
hgs
parents:
diff changeset
  2886
            lBufTextContent = TextTagProcessingL(&lPtrtoTextContent,
hgs
parents:
diff changeset
  2887
                                    startoffset,OrgLength,EndedWithCompleteTextTag);
hgs
parents:
diff changeset
  2888
            CleanupStack::PushL(lBufTextContent);
hgs
parents:
diff changeset
  2889
            TPtr lTempPtr(lBufTextContent->Des());
hgs
parents:
diff changeset
  2890
            lPtrtoTextContent.Set(lTempPtr);
hgs
parents:
diff changeset
  2891
            User::LeaveIfError(WriteToStream(lStream,lPtrtoTextContent));
hgs
parents:
diff changeset
  2892
            CleanupStack::PopAndDestroy(lBufTextContent);
hgs
parents:
diff changeset
  2893
            }
hgs
parents:
diff changeset
  2894
       else
hgs
parents:
diff changeset
  2895
            {
hgs
parents:
diff changeset
  2896
            HBufC *lBufTextAreaContent= NULL;
hgs
parents:
diff changeset
  2897
            HBufC* lBufPresentText = NULL;
hgs
parents:
diff changeset
  2898
            TInt textlength = ((CSvgTextAreaElementImpl *)lTextElementList[index])->GetLength();
hgs
parents:
diff changeset
  2899
            lBufTextAreaContent = HBufC::NewLC( textlength );
hgs
parents:
diff changeset
  2900
hgs
parents:
diff changeset
  2901
            TPtr lPtrtoGetTextAreaContent = lBufTextAreaContent->Des();
hgs
parents:
diff changeset
  2902
            ((CSvgTextAreaElementImpl *)lTextElementList[index])->GetText( lPtrtoGetTextAreaContent );
hgs
parents:
diff changeset
  2903
            TPtrC lPtrtoTextAreaContent=lPtrtoGetTextAreaContent;
hgs
parents:
diff changeset
  2904
            startoffset = endoffset + ((CSvgTextAreaElementImpl *)lTextElementList[index])->iOrgLength;
hgs
parents:
diff changeset
  2905
            lBufPresentText = TextAreaTagProcessingL(&lPtrtoTextAreaContent,startoffset,OrgLength,EndedWithCompleteTextTag);
hgs
parents:
diff changeset
  2906
            CleanupStack::PushL(lBufPresentText);
hgs
parents:
diff changeset
  2907
            TPtr lTempPtr(lBufPresentText->Des());
hgs
parents:
diff changeset
  2908
            lPtrtoTextAreaContent.Set(lTempPtr);
hgs
parents:
diff changeset
  2909
            User::LeaveIfError(WriteToStream(lStream,lPtrtoTextAreaContent));
hgs
parents:
diff changeset
  2910
            CleanupStack::PopAndDestroy(lBufPresentText);
hgs
parents:
diff changeset
  2911
            CleanupStack::PopAndDestroy(lBufTextAreaContent);
hgs
parents:
diff changeset
  2912
            }
hgs
parents:
diff changeset
  2913
            index++;
hgs
parents:
diff changeset
  2914
        }
hgs
parents:
diff changeset
  2915
hgs
parents:
diff changeset
  2916
    // Done using the list, close the list to avoid a memory leak
hgs
parents:
diff changeset
  2917
    CleanupStack::PopAndDestroy(&lTextElementList);
hgs
parents:
diff changeset
  2918
hgs
parents:
diff changeset
  2919
    // After processing all the editable text elements, are there any characters in the buffer
hgs
parents:
diff changeset
  2920
    if( startoffset < lBufferContent->Length() )
hgs
parents:
diff changeset
  2921
        {
hgs
parents:
diff changeset
  2922
        TPtrC lPtrtoRemainText = lBufferContent->Mid(startoffset,(lBufferContent->Length()-startoffset));
hgs
parents:
diff changeset
  2923
        User::LeaveIfError(WriteToStream(lStream,lPtrtoRemainText));
hgs
parents:
diff changeset
  2924
        }
hgs
parents:
diff changeset
  2925
hgs
parents:
diff changeset
  2926
    // Close the stream
hgs
parents:
diff changeset
  2927
    CleanupStack::PopAndDestroy(&lStream);
hgs
parents:
diff changeset
  2928
hgs
parents:
diff changeset
  2929
    // Close the file server session
hgs
parents:
diff changeset
  2930
    CleanupStack::PopAndDestroy(&lFs);
hgs
parents:
diff changeset
  2931
    }
hgs
parents:
diff changeset
  2932
hgs
parents:
diff changeset
  2933
//-----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2934
//Function to process the text and add tags at the end
hgs
parents:
diff changeset
  2935
//HBufC* CSvgEngineImpl::TextTagProcessing(TPtr* aCData, TInt aStartOffset, TInt aOrgLength,
hgs
parents:
diff changeset
  2936
//                              TBool aEndingWithTag)
hgs
parents:
diff changeset
  2937
//-----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2938
hgs
parents:
diff changeset
  2939
HBufC* CSvgEngineImpl::TextTagProcessingL(TPtrC* aCData,
hgs
parents:
diff changeset
  2940
                    TInt &aStartOffset, TInt aOrgLength,TBool aEndingWithTag)
hgs
parents:
diff changeset
  2941
    {
hgs
parents:
diff changeset
  2942
        HBufC * lTextContentBuffer = NULL;
hgs
parents:
diff changeset
  2943
        TPtrC lPtrToTextContent(*aCData) ;
hgs
parents:
diff changeset
  2944
        //Ending with complete text tag and original length is 0
hgs
parents:
diff changeset
  2945
        if( aEndingWithTag && aOrgLength == 0 )
hgs
parents:
diff changeset
  2946
            {//case b
hgs
parents:
diff changeset
  2947
            lTextContentBuffer = HBufC::NewLC(aCData->Length()
hgs
parents:
diff changeset
  2948
                                    + KClosingTextTagLength );
hgs
parents:
diff changeset
  2949
            TPtr lPtrToTempBuf(lTextContentBuffer->Des());//point to buffer
hgs
parents:
diff changeset
  2950
            lPtrToTempBuf.Append(*aCData);//append cdata
hgs
parents:
diff changeset
  2951
            lPtrToTempBuf.Append(KClosingTextTag);//append closing text tag
hgs
parents:
diff changeset
  2952
            aStartOffset += KClosingTextTagLength;
hgs
parents:
diff changeset
  2953
            }
hgs
parents:
diff changeset
  2954
        else if( !aEndingWithTag && aOrgLength == 0 )
hgs
parents:
diff changeset
  2955
            {//case a
hgs
parents:
diff changeset
  2956
            lTextContentBuffer = HBufC::NewLC(aCData->Length()
hgs
parents:
diff changeset
  2957
                                    + KClosingTextTagLength
hgs
parents:
diff changeset
  2958
                                    + KClosingBracesLength );
hgs
parents:
diff changeset
  2959
            TPtr lPtrToTempBuf(lTextContentBuffer->Des());//point to buffer
hgs
parents:
diff changeset
  2960
            lPtrToTempBuf.Append(KClosingBraces);
hgs
parents:
diff changeset
  2961
            lPtrToTempBuf.Append(*aCData);//append cdata
hgs
parents:
diff changeset
  2962
            lPtrToTempBuf.Append(KClosingTextTag);//append closing text tag
hgs
parents:
diff changeset
  2963
            aStartOffset += 2;// the length of /> which is 2 characters.
hgs
parents:
diff changeset
  2964
            }
hgs
parents:
diff changeset
  2965
        else if(aEndingWithTag && aOrgLength!= 0)
hgs
parents:
diff changeset
  2966
            {
hgs
parents:
diff changeset
  2967
            lTextContentBuffer = HBufC::NewLC(aCData->Length()
hgs
parents:
diff changeset
  2968
                                    + KClosingTextTagLength );
hgs
parents:
diff changeset
  2969
            TPtr lPtrToTempBuf(lTextContentBuffer->Des());//point to buffer
hgs
parents:
diff changeset
  2970
            lPtrToTempBuf.Append(*aCData);//append cdata
hgs
parents:
diff changeset
  2971
            lPtrToTempBuf.Append(KClosingTextTag);//append closing text tag
hgs
parents:
diff changeset
  2972
            aStartOffset += KClosingTextTagLength ;
hgs
parents:
diff changeset
  2973
            }
hgs
parents:
diff changeset
  2974
        else
hgs
parents:
diff changeset
  2975
            {
hgs
parents:
diff changeset
  2976
            //i.e !aEndingWithTag && OrgLength!=0
hgs
parents:
diff changeset
  2977
            //this case should never occur
hgs
parents:
diff changeset
  2978
            //becoz there is no possibility of
hgs
parents:
diff changeset
  2979
            //the quoted kind of text content definition in xml as shown below
hgs
parents:
diff changeset
  2980
            //"<text /> this is a text content"
hgs
parents:
diff changeset
  2981
            }
hgs
parents:
diff changeset
  2982
        // Pop the buffer from the cleanup stack as ownership is transferred
hgs
parents:
diff changeset
  2983
        // to caller
hgs
parents:
diff changeset
  2984
        CleanupStack::Pop(lTextContentBuffer);
hgs
parents:
diff changeset
  2985
        return lTextContentBuffer;
hgs
parents:
diff changeset
  2986
hgs
parents:
diff changeset
  2987
    }
hgs
parents:
diff changeset
  2988
hgs
parents:
diff changeset
  2989
//-----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2990
//Function to process the text and add tags at the end
hgs
parents:
diff changeset
  2991
//HBufC* CSvgEngineImpl::TextAreaTagProcessing(TPtr* aCData, TInt aStartOffset, TInt aOrgLength,
hgs
parents:
diff changeset
  2992
//                              TBool aEndingWithTag)
hgs
parents:
diff changeset
  2993
//-----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2994
hgs
parents:
diff changeset
  2995
HBufC* CSvgEngineImpl::TextAreaTagProcessingL(TPtrC* aCData, TInt &aStartOffset, TInt aOrgLength,
hgs
parents:
diff changeset
  2996
                                TBool aEndingWithTag)
hgs
parents:
diff changeset
  2997
    {
hgs
parents:
diff changeset
  2998
        HBufC * lTextAreaContentBuffer = NULL;
hgs
parents:
diff changeset
  2999
        TPtrC lPtrToTextAreaContent(*aCData) ;
hgs
parents:
diff changeset
  3000
hgs
parents:
diff changeset
  3001
hgs
parents:
diff changeset
  3002
        //Ending with complete text tag and original length is 0
hgs
parents:
diff changeset
  3003
        if( aEndingWithTag && aOrgLength == 0 )
hgs
parents:
diff changeset
  3004
            {//case e
hgs
parents:
diff changeset
  3005
            lTextAreaContentBuffer = HBufC::NewLC(aCData->Length()
hgs
parents:
diff changeset
  3006
                                        + KClosingTextAreaTagLength);
hgs
parents:
diff changeset
  3007
            TPtr lPtrToTempBuf(lTextAreaContentBuffer->Des());//point to buffer
hgs
parents:
diff changeset
  3008
            lPtrToTempBuf.Append(*aCData);//append cdata
hgs
parents:
diff changeset
  3009
            lPtrToTempBuf.Append(KClosingTextAreaTag);//append closing text tag
hgs
parents:
diff changeset
  3010
            aStartOffset += KClosingTextAreaTagLength;
hgs
parents:
diff changeset
  3011
            }
hgs
parents:
diff changeset
  3012
        else if( !aEndingWithTag && aOrgLength == 0 )
hgs
parents:
diff changeset
  3013
            {//case d
hgs
parents:
diff changeset
  3014
            lTextAreaContentBuffer = HBufC::NewLC(aCData->Length()
hgs
parents:
diff changeset
  3015
                                        + KClosingBracesLength
hgs
parents:
diff changeset
  3016
                                        + KClosingTextAreaTagLength );
hgs
parents:
diff changeset
  3017
            TPtr lPtrToTempBuf(lTextAreaContentBuffer->Des());//point to buffer
hgs
parents:
diff changeset
  3018
            lPtrToTempBuf.Append(KClosingBraces);
hgs
parents:
diff changeset
  3019
            lPtrToTempBuf.Append(*aCData);//append cdata
hgs
parents:
diff changeset
  3020
            lPtrToTempBuf.Append(KClosingTextAreaTag);//append closing text tag
hgs
parents:
diff changeset
  3021
            aStartOffset += 2;// the length of /> which is 2 characters.
hgs
parents:
diff changeset
  3022
            }
hgs
parents:
diff changeset
  3023
        else if(aEndingWithTag && aOrgLength!= 0)
hgs
parents:
diff changeset
  3024
            {//case f
hgs
parents:
diff changeset
  3025
            lTextAreaContentBuffer = HBufC::NewLC(aCData->Length()
hgs
parents:
diff changeset
  3026
                                        + KClosingTextAreaTagLength );
hgs
parents:
diff changeset
  3027
            TPtr lPtrToTempBuf(lTextAreaContentBuffer->Des());//point to buffer
hgs
parents:
diff changeset
  3028
            lPtrToTempBuf.Append(*aCData);//append cdata
hgs
parents:
diff changeset
  3029
            lPtrToTempBuf.Append(KClosingTextAreaTag);//append closing text tag
hgs
parents:
diff changeset
  3030
            aStartOffset += KClosingTextAreaTagLength;
hgs
parents:
diff changeset
  3031
            }
hgs
parents:
diff changeset
  3032
        else
hgs
parents:
diff changeset
  3033
            {
hgs
parents:
diff changeset
  3034
            //i.e !aEndingWithTag && OrgLength!=0
hgs
parents:
diff changeset
  3035
            //this case should never occur
hgs
parents:
diff changeset
  3036
            //becoz there is no possibility of
hgs
parents:
diff changeset
  3037
            //the quoted kind of text content definition in xml as shown below
hgs
parents:
diff changeset
  3038
            //"<textArea /> this is a text content"
hgs
parents:
diff changeset
  3039
            }
hgs
parents:
diff changeset
  3040
        // Pop the buffer from the cleanup stack as ownership is transferred
hgs
parents:
diff changeset
  3041
        // to caller
hgs
parents:
diff changeset
  3042
        CleanupStack::Pop(lTextAreaContentBuffer);
hgs
parents:
diff changeset
  3043
        return lTextAreaContentBuffer;
hgs
parents:
diff changeset
  3044
hgs
parents:
diff changeset
  3045
    }
hgs
parents:
diff changeset
  3046
hgs
parents:
diff changeset
  3047
hgs
parents:
diff changeset
  3048
//-----------------------------------------------------------------------------
hgs
parents:
diff changeset
  3049
//Function to Write the buffer to the stream.
hgs
parents:
diff changeset
  3050
//In SaveSVGL while editing text - used to write partial buffers into the stream.
hgs
parents:
diff changeset
  3051
//TInt CSvgEngineImpl::WriteToStream(RFileWriteStream* aStream,TPtrC aWriteBuffer)
hgs
parents:
diff changeset
  3052
//-----------------------------------------------------------------------------
hgs
parents:
diff changeset
  3053
TInt CSvgEngineImpl::WriteToStream(RFileWriteStream &aStream,TPtrC aWriteBuffer)
hgs
parents:
diff changeset
  3054
    {
hgs
parents:
diff changeset
  3055
    // Create a small output buffer
hgs
parents:
diff changeset
  3056
    TBuf8<KMaxConversionChars> outputBuffer;
hgs
parents:
diff changeset
  3057
hgs
parents:
diff changeset
  3058
    for(;;) // conversion loop
hgs
parents:
diff changeset
  3059
        {
hgs
parents:
diff changeset
  3060
        // Start conversion. When the output buffer is full, return the
hgs
parents:
diff changeset
  3061
        // number of characters that were not converted
hgs
parents:
diff changeset
  3062
        const TInt returnValue = CnvUtfConverter::ConvertFromUnicodeToUtf8(
hgs
parents:
diff changeset
  3063
            outputBuffer,   // Destination
hgs
parents:
diff changeset
  3064
            aWriteBuffer ); // Source
hgs
parents:
diff changeset
  3065
hgs
parents:
diff changeset
  3066
hgs
parents:
diff changeset
  3067
        // check to see that the descriptor isn’t corrupt - return with
hgs
parents:
diff changeset
  3068
        // err if it is
hgs
parents:
diff changeset
  3069
        if ( returnValue == CnvUtfConverter::EErrorIllFormedInput )
hgs
parents:
diff changeset
  3070
            {
hgs
parents:
diff changeset
  3071
            return( KErrCorrupt );
hgs
parents:
diff changeset
  3072
            }
hgs
parents:
diff changeset
  3073
        else
hgs
parents:
diff changeset
  3074
            {
hgs
parents:
diff changeset
  3075
            if ( returnValue < 0 ) // future-proof against "TError" expanding
hgs
parents:
diff changeset
  3076
                {
hgs
parents:
diff changeset
  3077
                return( KErrGeneral );
hgs
parents:
diff changeset
  3078
                }
hgs
parents:
diff changeset
  3079
            }
hgs
parents:
diff changeset
  3080
hgs
parents:
diff changeset
  3081
        // Store the converted contents of the output buffer into the stream
hgs
parents:
diff changeset
  3082
        TRAPD( err1, aStream.WriteL( outputBuffer ) );
hgs
parents:
diff changeset
  3083
        if ( err1 )
hgs
parents:
diff changeset
  3084
            {
hgs
parents:
diff changeset
  3085
            #ifdef _DEBUG
hgs
parents:
diff changeset
  3086
            RDebug::Printf("CSvgEngineImpl::WriteToStream error trapped=%d", err1);
hgs
parents:
diff changeset
  3087
            return err1;
hgs
parents:
diff changeset
  3088
            #endif
hgs
parents:
diff changeset
  3089
            }
hgs
parents:
diff changeset
  3090
hgs
parents:
diff changeset
  3091
        // Finish conversion if there are no unconverted characters in the
hgs
parents:
diff changeset
  3092
        // remainder buffer
hgs
parents:
diff changeset
  3093
        if ( returnValue == 0 )
hgs
parents:
diff changeset
  3094
            {
hgs
parents:
diff changeset
  3095
            break;
hgs
parents:
diff changeset
  3096
            }
hgs
parents:
diff changeset
  3097
hgs
parents:
diff changeset
  3098
        // Remove the converted source text from the remainder buffer.
hgs
parents:
diff changeset
  3099
        // The remainder buffer is then fed back into loop
hgs
parents:
diff changeset
  3100
        aWriteBuffer.Set( aWriteBuffer.Right( returnValue ));
hgs
parents:
diff changeset
  3101
        }
hgs
parents:
diff changeset
  3102
    return KErrNone;
hgs
parents:
diff changeset
  3103
    }
hgs
parents:
diff changeset
  3104
hgs
parents:
diff changeset
  3105
hgs
parents:
diff changeset
  3106
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3107
// void CSvgEngineImpl::FindEditableElements( CSvgElementImpl* aStartElement,
hgs
parents:
diff changeset
  3108
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3109
void CSvgEngineImpl::FindEditableElements( CSvgElementImpl* aStartElement,
hgs
parents:
diff changeset
  3110
                                           RPointerArray<CSvgElementImpl>& aList )
hgs
parents:
diff changeset
  3111
    {
hgs
parents:
diff changeset
  3112
    if ( aStartElement == NULL )
hgs
parents:
diff changeset
  3113
        {
hgs
parents:
diff changeset
  3114
        return;
hgs
parents:
diff changeset
  3115
        }
hgs
parents:
diff changeset
  3116
hgs
parents:
diff changeset
  3117
    CSvgElementImpl* child = (CSvgElementImpl*)aStartElement->FirstChild();
hgs
parents:
diff changeset
  3118
    while ( child != NULL )
hgs
parents:
diff changeset
  3119
    {
hgs
parents:
diff changeset
  3120
        // add to list if child is found
hgs
parents:
diff changeset
  3121
        if ( child->ElemID() == KSvgTextElement || child->ElemID() == KSvgTextAreaElement  )
hgs
parents:
diff changeset
  3122
            aList.Append( child );
hgs
parents:
diff changeset
  3123
hgs
parents:
diff changeset
  3124
        // find in grandchildren if element is not a textArea
hgs
parents:
diff changeset
  3125
        if ( child->ElemID() != KSvgTextAreaElement )
hgs
parents:
diff changeset
  3126
            {
hgs
parents:
diff changeset
  3127
        FindEditableElements( child, aList );
hgs
parents:
diff changeset
  3128
            }
hgs
parents:
diff changeset
  3129
        child = (CSvgElementImpl*)child->NextSibling();
hgs
parents:
diff changeset
  3130
    }
hgs
parents:
diff changeset
  3131
}
hgs
parents:
diff changeset
  3132
TBool CSvgEngineImpl::IsSVGEnginePaused()
hgs
parents:
diff changeset
  3133
{
hgs
parents:
diff changeset
  3134
	return (iSvgEngineState == ESVGEnginePaused );
hgs
parents:
diff changeset
  3135
hgs
parents:
diff changeset
  3136
}
hgs
parents:
diff changeset
  3137
hgs
parents:
diff changeset
  3138
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
  3139
// void CSvgEngineImpl::ResetContext()
hgs
parents:
diff changeset
  3140
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3141
void CSvgEngineImpl::ResetContext()
hgs
parents:
diff changeset
  3142
{
hgs
parents:
diff changeset
  3143
	if( iGfxContext )
hgs
parents:
diff changeset
  3144
		{
hgs
parents:
diff changeset
  3145
		iGfxContext->DestroyContext();
hgs
parents:
diff changeset
  3146
		}
hgs
parents:
diff changeset
  3147
}
hgs
parents:
diff changeset
  3148
hgs
parents:
diff changeset
  3149
void CSvgEngineImpl::SetBitmapHeader(const TDesC* aHeaderData)
hgs
parents:
diff changeset
  3150
    {
hgs
parents:
diff changeset
  3151
    if (iGfxContext)
hgs
parents:
diff changeset
  3152
        {
hgs
parents:
diff changeset
  3153
        ((CGfx2dGcOpenVG *)iGfxContext)->SetBitmapHeader(aHeaderData);
hgs
parents:
diff changeset
  3154
        }
hgs
parents:
diff changeset
  3155
    }
hgs
parents:
diff changeset
  3156
//NGA
hgs
parents:
diff changeset
  3157
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3158
// SetGdiContext File
hgs
parents:
diff changeset
  3159
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
  3160
hgs
parents:
diff changeset
  3161
void CSvgEngineImpl::SetGdiContextL(CFbsBitmap* aCurrentBitmap, CFbsBitmap* aMask,TSize aCurrentBitmapSize,TDisplayMode aRenderDspMode,TDisplayMode aMaskDspMode)
hgs
parents:
diff changeset
  3162
hgs
parents:
diff changeset
  3163
    {
hgs
parents:
diff changeset
  3164
    // Handle for both Non-NULL and NULL parameter
hgs
parents:
diff changeset
  3165
       iFrameBufferSize = aCurrentBitmapSize;
hgs
parents:
diff changeset
  3166
       iRenderDspMode   = aRenderDspMode;
hgs
parents:
diff changeset
  3167
       iMaskDspMode     = aMaskDspMode; 
hgs
parents:
diff changeset
  3168
       iFrameBuffer     = aCurrentBitmap;
hgs
parents:
diff changeset
  3169
       iMask            = aMask;
hgs
parents:
diff changeset
  3170
hgs
parents:
diff changeset
  3171
    if ( aCurrentBitmapSize.iWidth > 0 && aCurrentBitmapSize.iHeight > 0 )
hgs
parents:
diff changeset
  3172
        {
hgs
parents:
diff changeset
  3173
        if ( !iGfxContext )
hgs
parents:
diff changeset
  3174
            {
hgs
parents:
diff changeset
  3175
                iGfxContext = CGfx2dGcOpenVG::NewL( aCurrentBitmapSize, iBitmapFontSpec, iSvgBitmapFontProvider,1 );
hgs
parents:
diff changeset
  3176
            }
hgs
parents:
diff changeset
  3177
        else
hgs
parents:
diff changeset
  3178
            {
hgs
parents:
diff changeset
  3179
            iGfxContext->ChangeBufferSizeL( aCurrentBitmapSize );
hgs
parents:
diff changeset
  3180
            }
hgs
parents:
diff changeset
  3181
        }
hgs
parents:
diff changeset
  3182
    else if ( iGfxContext )
hgs
parents:
diff changeset
  3183
        {
hgs
parents:
diff changeset
  3184
        iGfxContext->ChangeBufferSizeL( TSize( 1, 1 ) );
hgs
parents:
diff changeset
  3185
        }
hgs
parents:
diff changeset
  3186
    }
hgs
parents:
diff changeset
  3187
const TPtrC8 CSvgEngineImpl::TLVEncodedData() const
hgs
parents:
diff changeset
  3188
    {
hgs
parents:
diff changeset
  3189
    return (iGfxContext->TLVEncodedData());
hgs
parents:
diff changeset
  3190
    }